about summary refs log tree commit diff
path: root/users/wpcarro/emacs/pkgs/list/list.el
diff options
context:
space:
mode:
Diffstat (limited to 'users/wpcarro/emacs/pkgs/list/list.el')
-rw-r--r--users/wpcarro/emacs/pkgs/list/list.el18
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
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;