Function: eca-chat--context-bar-allocate
eca-chat--context-bar-allocate is a natively compiled function defined
in eca-chat.el.
Signature
(eca-chat--context-bar-allocate TOKENS CELLS)
Documentation
Allocate CELLS whole cells across TOKENS by proportion.
Every positive entry gets at least one cell when CELLS allows it; the result is a list of non-negative integers summing to CELLS (or to the number of cells available when there are more categories than cells).
Source Code
;; Defined in /nix/store/jklqzw6pzz6j4jrbv8wy0iwgi7jlrbld-emacs-packages-deps/share/emacs/site-lisp/elpa/eca-20260928.1827/eca-chat.el
(defun eca-chat--context-bar-allocate (tokens cells)
"Allocate CELLS whole cells across TOKENS by proportion.
Every positive entry gets at least one cell when CELLS allows it; the
result is a list of non-negative integers summing to CELLS (or to the
number of cells available when there are more categories than cells)."
(let* ((n (length tokens))
(positives (cl-count-if (lambda (tk) (> tk 0)) tokens)))
(cond
((or (<= cells 0) (zerop positives)) (make-list n 0))
((<= cells positives)
;; Too tight for all: one cell each to the CELLS largest categories.
(let ((out (make-list n 0)))
(dolist (i (seq-take (eca-chat--context-bar-indices-by-tokens tokens) cells))
(when (> (nth i tokens) 0) (setf (nth i out) 1)))
out))
(t
;; One cell per positive category, then the rest by proportion.
(let* ((total (apply #'+ tokens))
(remaining (- cells positives))
(running 0) (prev 0)
(extra (mapcar (lambda (tk)
(setq running (+ running tk))
(let ((cum (round (* remaining (/ (float running) total)))))
(prog1 (- cum prev) (setq prev cum))))
tokens)))
(cl-mapcar (lambda (tk e) (+ (if (> tk 0) 1 0) e)) tokens extra))))))