Moritz Heidkamp avatar Moritz Heidkamp committed 406c418

implement siphon-input-port

Comments (0)

Files changed (2)

 (make-channel
  ;; derivators
  fork-channel fold-channel map-channel filter-channel
- siphon-channel
+ siphon-channel siphon-input-port
 
  ;; operations
  channel-enqueue channel-receive channel-receive/delay
      (when (pred? message)
        (channel-enqueue filtering-channel message)))))
 
+(define (siphon-input-port port read #!optional (channel (make-channel)))
+  (values (lambda ()
+            (let ((message (read port)))
+              (and (not (eof-object? message))
+                   (channel-enqueue channel message))))
+          channel))
+
 )
   (define p3 (channel-receive/delay c 0.5))
   (test-assert (not (force p3))))
 
+(test-group "siphon-input-port"
+  (define port (open-input-string "this is a test"))
+  (define-values (next channel) 
+    (siphon-input-port port read))
+
+  (let loop ()
+    (when (next)
+      (loop)))
+
+  (test '(this is a test) (channel-messages channel)))
+
 (test-end)
 
 (test-exit)
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.