]> gitweb.factorcode.org Git - factor.git/blob - basis/concurrency/combinators/combinators.factor
Merge up
[factor.git] / basis / concurrency / combinators / combinators.factor
1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: concurrency.futures concurrency.count-downs sequences
4 kernel macros fry combinators generalizations ;
5 IN: concurrency.combinators
6
7 <PRIVATE
8
9 : (parallel-each) ( n quot -- )
10     [ <count-down> ] dip keep await ; inline
11
12 PRIVATE>
13
14 : parallel-each ( seq quot -- )
15     over length [
16         '[ _ curry _ spawn-stage ] each
17     ] (parallel-each) ; inline
18
19 : 2parallel-each ( seq1 seq2 quot -- )
20     2over min-length [
21         '[ _ 2curry _ spawn-stage ] 2each
22     ] (parallel-each) ; inline
23
24 : parallel-filter ( seq quot -- newseq )
25     over [ selector [ parallel-each ] dip ] dip like ; inline
26
27 <PRIVATE
28
29 : [future] ( quot -- quot' ) '[ _ curry future ] ; inline
30
31 : future-values ( futures -- futures )
32     [ ?future ] map! ; inline
33
34 PRIVATE>
35
36 : parallel-map ( seq quot -- newseq )
37     [future] map future-values ; inline
38
39 : 2parallel-map ( seq1 seq2 quot -- newseq )
40     '[ _ 2curry future ] 2map future-values ;
41
42 <PRIVATE
43
44 : (parallel-spread) ( n -- spread-array )
45     [ ?future ] <repetition> ; inline
46
47 : (parallel-cleave) ( quots -- quot-array spread-array )
48     [ [future] ] map dup length (parallel-spread) ; inline
49
50 PRIVATE>
51
52 MACRO: parallel-cleave ( quots -- )
53     (parallel-cleave) '[ _ cleave _ spread ] ;
54
55 MACRO: parallel-spread ( quots -- )
56     (parallel-cleave) '[ _ spread _ spread ] ;
57
58 MACRO: parallel-napply ( quot n -- )
59     [ [future] ] dip dup (parallel-spread) '[ _ _ napply _ spread ] ;