 !
 ! Channels - based on ideas from newsqueak
 USING: kernel sequences sequences.lib threads continuations
-random math ;
+random math accessors ;
 IN: channels
 
 TUPLE: channel receivers senders ;

PRIVATE>

M: channel to ( value channel -- )
    dup channel-receivers
    dup empty? [ drop dup wait to ] [ nip (to) ] if ;

M: channel from ( channel -- value )
    [
        notify channel-senders
        dup empty? [ drop ] [ (from) ] if
    ] curry "channel receive" suspend ;

<PRIVATE

: wait ( channel -- )
    [ senders>> push ] curry
    "channel send" suspend drop ;

: (to) ( value receivers -- )
    delete-random resume-with yield ;

: notify ( continuation channel -- channel )
    [ receivers>> push ] keep ;

: (from) ( senders -- )
    delete-random resume ;
