about summary refs log tree commit diff
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2022-08-01T20·43-0700
committerclbot <clbot@tvl.fyi>2022-08-02T20·29+0000
commit5417b512e77a7434f7b1fc9d55035921725a8df1 (patch)
tree81b28a81def8eba77449717287c7026c4c952cdb
parent852cc4a9c8dac3d2a6afd139fee69a81f838db41 (diff)
feat(wpcarro/emacs): Support list-chunk function r/4365
Would be nice to remove the top-level `if` statement, but I can't be bothered to
debug the first unit test without that workaround.

Change-Id: I4ba576bda915eeb11f9fbfeb5d95d8e5668fd0bd
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6022
Reviewed-by: wpcarro <wpcarro@gmail.com>
Autosubmit: wpcarro <wpcarro@gmail.com>
Tested-by: BuildkiteCI
-rw-r--r--users/wpcarro/emacs/pkgs/list/list.el18
-rw-r--r--users/wpcarro/emacs/pkgs/list/tests.el10
2 files changed, 28 insertions, 0 deletions
diff --git a/users/wpcarro/emacs/pkgs/list/list.el b/users/wpcarro/emacs/pkgs/list/list.el
index 03382991e0..a1822e77ff 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
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/users/wpcarro/emacs/pkgs/list/tests.el b/users/wpcarro/emacs/pkgs/list/tests.el
index abba6b59d6..a6096a1d6e 100644
--- a/users/wpcarro/emacs/pkgs/list/tests.el
+++ b/users/wpcarro/emacs/pkgs/list/tests.el
@@ -42,3 +42,13 @@
 (ert-deftest list-join ()
   (should (equal "foo-bar-baz"
                  (list-join "-" '("foo" "bar" "baz")))))
+
+(ert-deftest list-chunk ()
+  (should (equal '((1 2 3 4 5 6))
+                 (list-chunk 7 '(1 2 3 4 5 6))))
+  (should (equal '((1) (2) (3) (4) (5) (6))
+                 (list-chunk 1 '(1 2 3 4 5 6))))
+  (should (equal '((1 2 3) (4 5 6))
+                 (list-chunk 3 '(1 2 3 4 5 6))))
+  (should (equal '((1 2) (3 4) (5 6))
+                 (list-chunk 2 '(1 2 3 4 5 6)))))