factor/extra/coroutines/coroutines.factor

52 lines
1.2 KiB
Factor
Raw Normal View History

2008-11-06 20:09:51 -05:00
! Copyright (C) 2005 Chris Double, 2007 Clemens Hofreither, 2008 James Cash.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
2008-09-10 23:11:40 -04:00
USING: kernel hashtables namespaces make continuations quotations
2008-08-31 03:51:43 -04:00
accessors ;
2007-09-20 18:09:08 -04:00
IN: coroutines
SYMBOL: current-coro
TUPLE: coroutine resumecc exitcc originalcc ;
2007-09-20 18:09:08 -04:00
: cocreate ( quot -- co )
coroutine new
2007-09-20 18:09:08 -04:00
dup current-coro associate
[ swapd , , \ bind ,
"Coroutine has terminated illegally." , \ throw ,
] [ ] make
[ >>resumecc ] [ >>originalcc ] bi ;
2007-09-20 18:09:08 -04:00
: coresume ( v co -- result )
[
2008-08-31 03:51:43 -04:00
>>exitcc
2009-04-17 12:14:16 -04:00
resumecc>> call( -- )
2007-09-20 18:09:08 -04:00
#! At this point, the coroutine quotation must have terminated
2009-04-17 12:14:16 -04:00
#! normally (without calling coyield, coreset, or coterminate).
#! This shouldn't happen.
2007-09-20 18:09:08 -04:00
f over
] callcc1 2nip ;
: coresume* ( v co -- ) coresume drop ; inline
: *coresume ( co -- result ) f swap coresume ; inline
: coyield ( v -- result )
current-coro get
[
[ continue-with ] curry
2008-08-31 03:51:43 -04:00
>>resumecc
exitcc>> continue-with
2007-09-20 18:09:08 -04:00
] callcc1 2nip ;
: coyield* ( v -- ) coyield drop ; inline
: *coyield ( -- v ) f coyield ; inline
: coterminate ( v -- )
current-coro get
2008-08-31 03:51:43 -04:00
[ ] >>resumecc
exitcc>> continue-with ;
: coreset ( v -- )
current-coro get dup
originalcc>> >>resumecc
2009-04-17 12:14:16 -04:00
exitcc>> continue-with ;