]> gitweb.factorcode.org Git - factor.git/blob - basis/channels/examples/examples.factor
Delete empty unit tests files, remove 1- and 1+, reorder IN: lines in a lot of places...
[factor.git] / basis / channels / examples / examples.factor
1 ! Copyright (C) 2007 Chris Double. All Rights Reserved.
2 ! See http://factorcode.org/license.txt for BSD license.
3 !
4 ! Examples of using channels
5 USING: kernel threads channels math namespaces
6 locals sequences ;
7 IN: channels.examples
8
9 : (counter) ( channel n -- )
10     [ swap to ] 2keep 1 + (counter) ;
11     
12 : counter ( channel -- )
13     2 (counter) ;    
14
15 : counter-test ( -- n1 n2 n3 )
16     <channel> dup [ counter ] curry "Counter" spawn drop 
17     [ from ] keep [ from ] keep from ;
18
19 : filter ( send prime recv -- )
20     #! Receives numbers from the 'send' channel,
21     #! filters out all those divisible by 'prime',
22     #! and sends to the 'recv' channel.
23     [
24         from swap dupd mod zero? not [ swap to ] [ 2drop ] if     
25     ] 3keep filter ;
26
27 :: (sieve) ( prime c -- )
28     [let | p [ c from ] 
29            newc [ <channel> ] |
30         p prime to
31         [ newc p c filter ] "Filter" spawn drop
32         prime newc (sieve)
33     ] ;
34
35 : sieve ( prime -- ) 
36     #! Send prime numbers to 'prime' channel
37     <channel> dup [ counter ] curry "Counter" spawn drop
38     (sieve) ;
39
40 : sieve-test ( -- seq )
41     <channel> dup [ sieve ] curry "Sieve" spawn drop
42     V{ } clone swap 
43     [ from swap push ] 2keep
44     [ from swap push ] 2keep
45     [ from swap push ] 2keep
46     [ from swap push ] 2keep
47     [ from swap push ] 2keep
48     [ from swap push ] 2keep
49     [ from swap push ] 2keep
50     [ from swap push ] 2keep
51     drop ;