summaryrefslogtreecommitdiff
path: root/chickadee
diff options
context:
space:
mode:
authorDavid Thompson <dthompson2@worcester.edu>2018-11-29 16:26:48 -0500
committerDavid Thompson <dthompson2@worcester.edu>2018-11-29 16:30:55 -0500
commitfb8f3bcd6cec02243098ec60838ce0a7778aff38 (patch)
tree85fadec487084f4c8bfe7ff9c6c31a6e6f8ef111 /chickadee
parent1afab11233de20272bdc029e70a5e1dcfd17218e (diff)
scripting: channel: Add channel-get! and channel-put! procedures.
* chickadee/scripting/channel.scm (channel-get!, channel-put!): New procedures. * doc/api.texi [Channels]: Add docs.
Diffstat (limited to 'chickadee')
-rw-r--r--chickadee/scripting/channel.scm22
1 files changed, 18 insertions, 4 deletions
diff --git a/chickadee/scripting/channel.scm b/chickadee/scripting/channel.scm
index 4d8583f..7ec11ce 100644
--- a/chickadee/scripting/channel.scm
+++ b/chickadee/scripting/channel.scm
@@ -23,7 +23,9 @@
#:use-module (chickadee scripting script)
#:export (make-channel
channel?
+ channel-get!
channel-get
+ channel-put!
channel-put))
;; A very simplified notion of channels compared to guile-fibers. In
@@ -55,18 +57,30 @@
(get-cont data)
(put-cont)))))))
+(define (channel-get! channel proc)
+ "Asynchronously retrieve a value from CHANNEL and call PROC with
+that value."
+ (enqueue! (channel-get-queue channel) proc)
+ (maybe-deliver channel))
+
(define (channel-get channel)
"Retrieve a value from CHANNEL. The current script suspends until a
value is available."
(yield
(lambda (cont)
- (enqueue! (channel-get-queue channel) cont)
- (maybe-deliver channel))))
+ (channel-get! channel cont))))
+
+(define noop (lambda () #t))
+
+(define* (channel-put! channel data #:optional (thunk noop))
+ "Asynchronously send DATA to CHANNEL and call THUNK after it has
+been received."
+ (enqueue! (channel-put-queue channel) (cons data thunk))
+ (maybe-deliver channel))
(define (channel-put channel data)
"Send DATA to CHANNEL. The current script suspends until another
script is available to retrieve the value."
(yield
(lambda (cont)
- (enqueue! (channel-put-queue channel) (cons data cont))
- (maybe-deliver channel))))
+ (channel-put! channel data cont))))