factor/basis/channels/examples/examples.factor

52 lines
1.4 KiB
Factor
Raw Normal View History

2007-09-20 18:09:08 -04:00
! Copyright (C) 2007 Chris Double. All Rights Reserved.
! See http://factorcode.org/license.txt for BSD license.
!
! Examples of using channels
2008-02-18 08:30:16 -05:00
USING: kernel threads channels math namespaces
locals sequences ;
2007-09-20 18:09:08 -04:00
IN: channels.examples
: (counter) ( channel n -- )
[ swap to ] 2keep 1+ (counter) ;
: counter ( channel -- )
2 (counter) ;
: counter-test ( -- n1 n2 n3 )
2008-02-18 08:30:16 -05:00
<channel> dup [ counter ] curry "Counter" spawn drop
2007-09-20 18:09:08 -04:00
[ from ] keep [ from ] keep from ;
: filter ( send prime recv -- )
#! Receives numbers from the 'send' channel,
#! filters out all those divisible by 'prime',
#! and sends to the 'recv' channel.
[
from swap dupd mod zero? not [ swap to ] [ 2drop ] if
] 3keep filter ;
2008-02-26 19:40:32 -05:00
:: (sieve) ( prime c -- )
2007-09-20 18:09:08 -04:00
[let | p [ c from ]
newc [ <channel> ] |
p prime to
[ newc p c filter ] "Filter" spawn drop
2007-09-20 18:09:08 -04:00
prime newc (sieve)
] ;
: sieve ( prime -- )
#! Send prime numbers to 'prime' channel
2008-02-18 08:30:16 -05:00
<channel> dup [ counter ] curry "Counter" spawn drop
2007-09-20 18:09:08 -04:00
(sieve) ;
: sieve-test ( -- seq )
2008-02-18 08:30:16 -05:00
<channel> dup [ sieve ] curry "Sieve" spawn drop
2007-09-20 18:09:08 -04:00
V{ } clone swap
[ from swap push ] 2keep
[ from swap push ] 2keep
[ from swap push ] 2keep
[ from swap push ] 2keep
[ from swap push ] 2keep
[ from swap push ] 2keep
[ from swap push ] 2keep
[ from swap push ] 2keep
drop ;