1 ! Copyright (C) 2008 Slava Pestov.
\r
2 ! See http://factorcode.org/license.txt for BSD license.
\r
3 USING: concurrency.futures concurrency.count-downs sequences
\r
4 kernel macros fry combinators generalizations ;
\r
5 IN: concurrency.combinators
\r
9 : (parallel-each) ( n quot -- )
\r
10 [ <count-down> ] dip keep await ; inline
\r
14 : parallel-each ( seq quot -- )
\r
16 '[ _ curry _ spawn-stage ] each
\r
17 ] (parallel-each) ; inline
\r
19 : 2parallel-each ( seq1 seq2 quot -- )
\r
21 '[ _ 2curry _ spawn-stage ] 2each
\r
22 ] (parallel-each) ; inline
\r
24 : parallel-filter ( seq quot -- newseq )
\r
25 over [ pusher [ parallel-each ] dip ] dip like ; inline
\r
29 : [future] ( quot -- quot' ) '[ _ curry future ] ; inline
\r
31 : future-values ( futures -- futures )
\r
32 dup [ ?future ] change-each ; inline
\r
36 : parallel-map ( seq quot -- newseq )
\r
37 [future] map future-values ; inline
\r
39 : 2parallel-map ( seq1 seq2 quot -- newseq )
\r
40 '[ _ 2curry future ] 2map future-values ;
\r
44 : (parallel-spread) ( n -- spread-array )
\r
45 [ ?future ] <repetition> ; inline
\r
47 : (parallel-cleave) ( quots -- quot-array spread-array )
\r
48 [ [future] ] map dup length (parallel-spread) ; inline
\r
52 MACRO: parallel-cleave ( quots -- )
\r
53 (parallel-cleave) '[ _ cleave _ spread ] ;
\r
55 MACRO: parallel-spread ( quots -- )
\r
56 (parallel-cleave) '[ _ spread _ spread ] ;
\r
58 MACRO: parallel-napply ( quot n -- )
\r
59 [ [future] ] dip dup (parallel-spread) '[ _ _ napply _ spread ] ;
\r