factor/extra/coroutines/coroutines.factor

46 lines
1.1 KiB
Factor

! Copyright (C) 2005 Chris Double, 2007 Clemens Hofreither.
! See http://factorcode.org/license.txt for BSD license.
USING: kernel hashtables namespaces continuations quotations
accessors ;
IN: coroutines
SYMBOL: current-coro
TUPLE: coroutine resumecc exitcc ;
: cocreate ( quot -- co )
coroutine new
dup current-coro associate
[ swapd , , \ bind ,
"Coroutine has terminated illegally." , \ throw ,
] [ ] make
>>resumecc ;
: coresume ( v co -- result )
[
>>exitcc
resumecc>> call
#! At this point, the coroutine quotation must have terminated
#! normally (without calling coyield or coterminate). This shouldn't happen.
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
>>resumecc
exitcc>> continue-with
] callcc1 2nip ;
: coyield* ( v -- ) coyield drop ; inline
: *coyield ( -- v ) f coyield ; inline
: coterminate ( v -- )
current-coro get
[ ] >>resumecc
exitcc>> continue-with ;