summary refs log tree commit diff
path: root/mew.scm
diff options
context:
space:
mode:
Diffstat (limited to 'mew.scm')
-rw-r--r--mew.scm51
1 files changed, 36 insertions, 15 deletions
diff --git a/mew.scm b/mew.scm
index 524c10c..5828f36 100644
--- a/mew.scm
+++ b/mew.scm
@@ -7,7 +7,8 @@
      empty? eof esc
      fail fin final for fun*
      gconcatenate gen generator-xfold generic-for-each genumerate get
-     gfix giterate gmatch gpick group-by-accumulator gslice-when gsplit gwindow
+     gfix giterate gmatch gpick group-by-accumulator gslice-when
+     gsplit gsplit-on gwindow
      imp inc inject into
      juxt
      keys
@@ -534,6 +535,26 @@
                 (set! window (append (cdr window) (list next)))
                 window)))))))
 
+  (define (gsplit-on pred gen)
+    (let ((slice '())
+          (this #f))
+      (lambda ()
+        (if (eof-object? this)
+          this
+          (let loop ()
+            (set! this (gen))
+            (if (eof-object? this)
+              (if (null? slice)
+                (eof)
+                (reverse slice))
+              (if (pred this)
+                (let ((finished-slice (reverse slice)))
+                  (set! slice '())
+                  finished-slice)
+                (begin
+                  (set! slice (cons this slice))
+                  (loop)))))))))
+
   (define (gslice-when pred gen)
     (let ((slice #f)
           (prev #f)
@@ -545,20 +566,20 @@
             (set! this (eof)))
           (set! slice (list prev)))
         (if (eof-object? this)
-            this
-            (let loop ()
-              (set! this (gen))
-              (if (eof-object? this)
-                  (reverse slice)
-                  (if (pred prev this)
-                      (let ((finished-slice (reverse slice)))
-                        (set! slice (list this))
-                        (set! prev this)
-                        finished-slice)
-                      (begin
-                        (set! slice (cons this slice))
-                        (set! prev this)
-                        (loop)))))))))
+          this
+          (let loop ()
+            (set! this (gen))
+            (if (eof-object? this)
+              (reverse slice)
+              (if (pred prev this)
+                (let ((finished-slice (reverse slice)))
+                  (set! slice (list this))
+                  (set! prev this)
+                  finished-slice)
+                (begin
+                  (set! slice (cons this slice))
+                  (set! prev this)
+                  (loop)))))))))
 
   (define (genumerate gen)
     (let ((n -1))