factor/extra/alarms/alarms.factor

88 lines
2.0 KiB
Factor
Raw Normal View History

2007-11-06 16:51:50 -05:00
! Copyright (C) 2007 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
2008-02-18 08:30:16 -05:00
USING: arrays calendar combinators concurrency.messaging
threads generic init kernel math namespaces sequences ;
2007-11-06 16:51:50 -05:00
IN: alarms
TUPLE: alarm time quot ;
C: <alarm> alarm
<PRIVATE
! for now a V{ }, eventually a min-heap to store alarms
SYMBOL: alarms
SYMBOL: alarm-receiver
SYMBOL: alarm-looper
: add-alarm ( alarm -- )
alarms get-global push ;
: remove-alarm ( alarm -- )
2008-01-09 17:36:30 -05:00
alarms get-global delete ;
2007-11-06 16:51:50 -05:00
: handle-alarm ( alarm -- )
dup delegate {
{ "register" [ add-alarm ] }
{ "unregister" [ remove-alarm ] }
} case ;
: expired-alarms ( -- seq )
now alarms get-global
2008-01-09 17:36:30 -05:00
[ alarm-time <=> 0 > ] with subset ;
2007-11-06 16:51:50 -05:00
: unexpired-alarms ( -- seq )
now alarms get-global
2008-01-09 17:36:30 -05:00
[ alarm-time <=> 0 <= ] with subset ;
2007-11-06 16:51:50 -05:00
: call-alarm ( alarm -- )
2008-02-18 08:30:16 -05:00
alarm-quot "Alarm invocation" spawn drop ;
2007-11-06 16:51:50 -05:00
: do-alarms ( -- )
expired-alarms [ call-alarm ] each
unexpired-alarms alarms set-global ;
: alarm-receive-loop ( -- )
receive dup alarm? [ handle-alarm ] [ drop ] if
alarm-receive-loop ;
: start-alarm-receiver ( -- )
[
alarm-receive-loop
2008-02-18 08:30:16 -05:00
] "Alarm receiver" spawn alarm-receiver set-global ;
2007-11-06 16:51:50 -05:00
: alarm-loop ( -- )
alarms get-global empty? [
do-alarms
] unless 100 sleep alarm-loop ;
: start-alarm-looper ( -- )
[
alarm-loop
2008-02-18 08:30:16 -05:00
] "Alarm looper" spawn alarm-looper set-global ;
2007-11-06 16:51:50 -05:00
: send-alarm ( str alarm -- )
over set-delegate
alarm-receiver get-global send ;
: start-alarm-daemon ( -- )
alarms get-global [ V{ } clone alarms set-global ] unless
start-alarm-looper
start-alarm-receiver ;
[ start-alarm-daemon ] "alarms" add-init-hook
PRIVATE>
: register-alarm ( alarm -- )
"register" send-alarm ;
: unregister-alarm ( alarm -- )
"unregister" send-alarm ;
: change-alarm ( alarm-old alarm-new -- )
"register" send-alarm
"unregister" send-alarm ;
! Example:
! 5 seconds from-now [ "hi" print flush ] <alarm> register-alarm