From 64de4d1bfe1a2d67b8aa3e846d8d86760682b395 Mon Sep 17 00:00:00 2001 From: David Thompson Date: Mon, 17 Feb 2014 18:44:15 -0500 Subject: 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. --- 2d/signal.scm | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) (limited to '2d/signal.scm') 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))) -- cgit v1.2.3