summary refs log tree commit diff
path: root/mew.scm
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2022-12-16 00:15:35 +0100
committerLeah Neukirchen <leah@vuxu.org>2022-12-16 00:15:48 +0100
commit234dbc781c328db11c3cc17a74d2c9301e5d82bf (patch)
tree3d786a0b3289154ba2e7a012250deb66a513d3e1 /mew.scm
parenta68ffccdccc9023c1beb14cae2a8d2695e517da0 (diff)
downloadmew-234dbc781c328db11c3cc17a74d2c9301e5d82bf.tar.gz
mew-234dbc781c328db11c3cc17a74d2c9301e5d82bf.tar.xz
mew-234dbc781c328db11c3cc17a74d2c9301e5d82bf.zip
add inject-accumulator
Diffstat (limited to 'mew.scm')
-rw-r--r--mew.scm22
1 files changed, 21 insertions, 1 deletions
diff --git a/mew.scm b/mew.scm
index 8635195..be9ae9b 100644
--- a/mew.scm
+++ b/mew.scm
@@ -9,7 +9,7 @@
      gconcatenate gen generator-xfold generic-for-each genumerate get
      gfix giterate gmatch gpick group-by-accumulator gslice-when
      gsplit gsplit-on gwindow
-     imp inc inject into
+     imp inc inject inject-accumulator into
      juxt
      keys
      len lines loc
@@ -962,6 +962,26 @@
                (set! state x))
              (set! n (dec n)))))))
 
+  (define inject-accumulator
+    (case-lambda
+      ((f) (let ((first #t)
+                 (state (void)))
+             (lambda (x)
+               (if (eof-object? x)
+                 (if first
+                   (f)
+                   state)
+                 (if first
+                   (begin
+                     (set! state x)
+                     (set! first #f))
+                   (set! state (f state x)))))))
+      ((f init) (let ((state init))
+                  (lambda (x)
+                    (if (eof-object? x)
+                      state
+                      (set! state (f state x))))))))
+
   (define (generator-xfold f seed . gs)
     (define (inner-xfold seed)
       (let ((vs (map (lambda (g) (g)) gs)))