Working on better POST and PUT requests
[factor/jcg.git] / extra / coroutines / coroutines.factor
blob51276336e352bfadc0e6b008ea70747a6442bd88
1 ! Copyright (C) 2005 Chris Double, 2007 Clemens Hofreither, 2008 James Cash.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel hashtables namespaces make continuations quotations
4 accessors ;
5 IN: coroutines
7 SYMBOL: current-coro
9 TUPLE: coroutine resumecc exitcc originalcc ;
11 : cocreate ( quot -- co )
12   coroutine new
13   dup current-coro associate
14   [ swapd , , \ bind , 
15     "Coroutine has terminated illegally." , \ throw ,
16   ] [ ] make
17   [ >>resumecc ] [ >>originalcc ] bi ;
19 : coresume ( v co -- result )
20   [ 
21     >>exitcc
22     resumecc>> call
23     #! At this point, the coroutine quotation must have terminated
24     #! normally (without calling coyield, coreset, or coterminate). This shouldn't happen.
25     f over
26   ] callcc1 2nip ;
28 : coresume* ( v co -- ) coresume drop ; inline
29 : *coresume ( co -- result ) f swap coresume ; inline
31 : coyield ( v -- result )
32   current-coro get
33   [  
34     [ continue-with ] curry
35     >>resumecc
36     exitcc>> continue-with
37   ] callcc1 2nip ;
39 : coyield* ( v -- ) coyield drop ; inline
40 : *coyield ( -- v ) f coyield ; inline
42 : coterminate ( v -- )
43   current-coro get
44   [ ] >>resumecc
45   exitcc>> continue-with ;
47 : coreset ( v --  )
48   current-coro get dup
49   originalcc>> >>resumecc
50   exitcc>> continue-with ;