]> gitweb.factorcode.org Git - factor.git/blob - basis/concurrency/combinators/combinators.factor
Factor source files should not be executable
[factor.git] / basis / concurrency / combinators / combinators.factor
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
11 \r
12 PRIVATE>\r
13 \r
14 : parallel-each ( seq quot -- )\r
15     over length [\r
16         '[ _ curry _ spawn-stage ] each\r
17     ] (parallel-each) ; inline\r
18 \r
19 : 2parallel-each ( seq1 seq2 quot -- )\r
20     2over min-length [\r
21         '[ _ 2curry _ spawn-stage ] 2each\r
22     ] (parallel-each) ; inline\r
23 \r
24 : parallel-filter ( seq quot -- newseq )\r
25     over [ pusher [ parallel-each ] dip ] dip like ; inline\r
26 \r
27 <PRIVATE\r
28 \r
29 : [future] ( quot -- quot' ) '[ _ curry future ] ; inline\r
30 \r
31 : future-values ( futures -- futures )\r
32     [ ?future ] map! ; inline\r
33 \r
34 PRIVATE>\r
35 \r
36 : parallel-map ( seq quot -- newseq )\r
37     [future] map future-values ; inline\r
38 \r
39 : 2parallel-map ( seq1 seq2 quot -- newseq )\r
40     '[ _ 2curry future ] 2map future-values ;\r
41 \r
42 <PRIVATE\r
43 \r
44 : (parallel-spread) ( n -- spread-array )\r
45     [ ?future ] <repetition> ; inline\r
46 \r
47 : (parallel-cleave) ( quots -- quot-array spread-array )\r
48     [ [future] ] map dup length (parallel-spread) ; inline\r
49 \r
50 PRIVATE>\r
51 \r
52 MACRO: parallel-cleave ( quots -- )\r
53     (parallel-cleave) '[ _ cleave _ spread ] ;\r
54 \r
55 MACRO: parallel-spread ( quots -- )\r
56     (parallel-cleave) '[ _ spread _ spread ] ;\r
57 \r
58 MACRO: parallel-napply ( quot n -- )\r
59     [ [future] ] dip dup (parallel-spread) '[ _ _ napply _ spread ] ;\r