summaryrefslogtreecommitdiff
path: root/2d/signal.scm
diff options
context:
space:
mode:
authorDavid Thompson <dthompson2@worcester.edu>2014-02-17 18:44:15 -0500
committerDavid Thompson <dthompson2@worcester.edu>2014-02-17 18:44:15 -0500
commit64de4d1bfe1a2d67b8aa3e846d8d86760682b395 (patch)
treee97b854cb3cf065c2e9c3fd7c377cdb563fc2201 /2d/signal.scm
parent67ee61d144eff51fa3981812925bd7ca1a852368 (diff)
Move time module inside the signal module.
* 2d/signal.scm (make-boxed-signal, %signal-ref, %signal-set!): Don't export. (signal-sample, signal-delay, signal-throttle): New procedures. * 2d/time.scm: Delete file.
Diffstat (limited to '2d/signal.scm')
-rw-r--r--2d/signal.scm40
1 files changed, 36 insertions, 4 deletions
diff --git a/2d/signal.scm b/2d/signal.scm
index 272cbfb..53f676a 100644
--- a/2d/signal.scm
+++ b/2d/signal.scm
@@ -25,15 +25,13 @@
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-9)
#:use-module (srfi srfi-26)
+ #:use-module (2d agenda)
#:export (signal?
signal-box?
make-signal
- make-boxed-signal
define-signal
- %signal-ref
signal-ref
signal-ref-maybe
- %signal-set!
signal-set!
signal-proc
signal-merge
@@ -44,7 +42,10 @@
signal-reject
signal-constant
signal-count
- signal-do))
+ signal-do
+ signal-sample
+ signal-delay
+ signal-throttle))
;;;
;;; Signals
@@ -227,3 +228,34 @@ from SIGNAL. The value of the new signal will always be the value of
SIGNAL. This signal is a convenient way to sneak a procedure that has
a side-effect into a signal chain."
(signal-map (lambda (x) (proc x) x) signal))
+
+(define (signal-sample agenda delay signal)
+ "Create a new signal that emits the value contained within SIGNAL
+every DELAY ticks of AGENDA."
+ (let ((sampler (%make-signal (signal-ref signal) #f '())))
+ (define (tick)
+ (%signal-set! sampler (signal-ref signal)))
+ (schedule-interval agenda tick delay)
+ (make-signal-box sampler)))
+
+(define (signal-delay agenda delay signal)
+ "Create a new signal that delays propagation of SIGNAL by DELAY
+ticks of AGENDA."
+ (make-boxed-signal (signal-ref signal)
+ (lambda (self value)
+ (schedule agenda
+ (lambda ()
+ (%signal-set! self value))
+ delay))
+ (list signal)))
+
+(define (signal-throttle agenda delay signal)
+ "Return a new signal that propagates SIGNAL at most once every DELAY
+ticks of AGENDA."
+ (make-boxed-signal (signal-ref signal)
+ (let ((last-time (agenda-time agenda)))
+ (lambda (self value)
+ (when (>= (- (agenda-time agenda) last-time) delay)
+ (%signal-set! self value)
+ (set! last-time (agenda-time agenda)))))
+ (list signal)))