Merge branch 'master' of git://factorcode.org/git/factor
[factor/jcg.git] / basis / concurrency / combinators / combinators.factor
blob3d18b9e029c26ff5f4c299c7a2da68179d922735
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
6 \r
7 <PRIVATE\r
8 \r
9 : (parallel-each) ( n quot -- )\r
10     [ <count-down> ] dip keep await ; inline\r
12 PRIVATE>\r
14 : parallel-each ( seq quot -- )\r
15     over length [\r
16         '[ _ curry _ spawn-stage ] each\r
17     ] (parallel-each) ; inline\r
19 : 2parallel-each ( seq1 seq2 quot -- )\r
20     2over min-length [\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
27 <PRIVATE\r
29 : [future] ( quot -- quot' ) '[ _ curry future ] ; inline\r
31 : future-values ( futures -- futures )\r
32     dup [ ?future ] change-each ; inline\r
34 PRIVATE>\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
42 <PRIVATE\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
50 PRIVATE>\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