Bug fixes for lcs.diff2html; xml.writer
[factor/jcg.git] / basis / channels / channels.factor
blob9b8c418634183d6cae0c4b9093e4461874354f22
1 ! Copyright (C) 2007 Chris Double. All Rights Reserved.
2 ! See http://factorcode.org/license.txt for BSD license.
4 ! Channels - based on ideas from newsqueak
5 USING: kernel sequences threads continuations
6 random math accessors random ;
7 IN: channels
9 TUPLE: channel receivers senders ;
11 : <channel> ( -- channel )
12     V{ } clone V{ } clone channel boa ;
14 GENERIC: to ( value channel -- )
15 GENERIC: from ( channel -- value )
17 <PRIVATE
19 : wait ( channel -- )
20     [ senders>> push ] curry
21     "channel send" suspend drop ;
23 : (to) ( value receivers -- )
24     delete-random resume-with yield ;
26 : notify ( continuation channel -- channel )
27     [ receivers>> push ] keep ;
29 : (from) ( senders -- )
30     delete-random resume ;
32 PRIVATE>
34 M: channel to ( value channel -- )
35     dup receivers>>
36     [ dup wait to ] [ nip (to) ] if-empty ;
38 M: channel from ( channel -- value )
39     [
40         notify senders>>
41         [ (from) ] unless-empty
42     ] curry "channel receive" suspend ;