diff options
Diffstat (limited to 'users/wpcarro/emacs/pkgs/list/list.el')
-rw-r--r-- | users/wpcarro/emacs/pkgs/list/list.el | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/users/wpcarro/emacs/pkgs/list/list.el b/users/wpcarro/emacs/pkgs/list/list.el index 03382991e035..a1822e77ff60 100644 --- a/users/wpcarro/emacs/pkgs/list/list.el +++ b/users/wpcarro/emacs/pkgs/list/list.el @@ -160,6 +160,24 @@ (list-cons x acc))) xs))) +(defun list-chunk (n xs) + "Chunk XS into lists of size N." + (if (> n (length xs)) + (list xs) + (->> xs + (list-reduce '(:curr () :result ()) + (lambda (x acc) + (let ((curr (plist-get acc :curr)) + (result (plist-get acc :result))) + (if (= (- n 1) (length curr)) + `(:curr () :result ,(list-cons (list-reverse (list-cons x curr)) result)) + `(:curr ,(list-cons x curr) :result ,result))))) + (funcall (lambda (xs) + (let ((curr (plist-get xs :curr)) + (result (plist-get xs :result))) + (if curr (list-cons curr result)) result))) + list-reverse))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Predicates ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |