]> gitweb.factorcode.org Git - factor.git/blob - basis/channels/examples/examples.factor
factor: trim using lists
[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 sequences ;
6 IN: channels.examples
7
8 : (counter) ( channel n -- )
9     [ swap to ] 2keep 1 + (counter) ;
10
11 : counter ( channel -- )
12     2 (counter) ;
13
14 : counter-test ( -- n1 n2 n3 )
15     <channel> dup [ counter ] curry "Counter" spawn drop
16     [ from ] keep [ from ] keep from ;
17
18 : filter ( send prime recv -- )
19     ! Receives numbers from the 'send' channel,
20     ! filters out all those divisible by 'prime',
21     ! and sends to the 'recv' channel.
22     [
23         from swap dupd mod zero? not [ swap to ] [ 2drop ] if
24     ] 3keep filter ;
25
26 :: (sieve) ( prime c -- )
27     c from :> p
28     <channel> :> newc
29     p prime to
30     [ newc p c filter ] "Filter" spawn drop
31     prime newc (sieve) ;
32
33 : sieve ( prime -- )
34     ! Send prime numbers to 'prime' channel
35     <channel> dup [ counter ] curry "Counter" spawn drop
36     (sieve) ;
37
38 : sieve-test ( -- seq )
39     <channel> dup [ sieve ] curry "Sieve" spawn drop
40     V{ } clone swap
41     [ from swap push ] 2keep
42     [ from swap push ] 2keep
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     drop ;