1 ! Copyright (C) 2008 Slava Pestov.
2 ! See https://factorcode.org/license.txt for BSD license.
3 USING: arrays assocs combinators concurrency.count-downs
4 concurrency.futures generalizations kernel sequences
5 sequences.private sequences.product ;
6 IN: concurrency.combinators
10 : (parallel-each) ( n quot -- )
11 [ <count-down> ] dip keep await ; inline
15 : parallel-each ( seq quot: ( elt -- ) -- )
17 '[ _ curry _ spawn-stage ] each
18 ] (parallel-each) ; inline
20 : 2parallel-each ( seq1 seq2 quot: ( elt1 elt2 -- ) -- )
22 '[ _ 2curry _ spawn-stage ] 2each
23 ] (parallel-each) ; inline
25 : parallel-product-each ( seq quot: ( elt -- ) -- )
26 [ <product-sequence> ] dip parallel-each ;
28 : parallel-cartesian-each ( seq1 seq2 quot: ( elt1 elt2 -- ) -- )
29 [ 2array ] dip [ first2-unsafe ] prepose parallel-product-each ;
31 : parallel-filter ( seq quot: ( elt -- ? ) -- newseq )
32 over [ selector [ parallel-each ] dip ] dip like ; inline
36 : [future] ( quot -- quot' ) '[ _ curry future ] ; inline
38 : future-values ( futures -- futures )
39 [ ?future ] map! ; inline
43 : parallel-map ( seq quot: ( elt -- newelt ) -- newseq )
44 [future] map future-values ; inline
46 : parallel-assoc-map-as ( assoc quot: ( key value -- newkey newvalue ) exemplar -- newassoc )
48 [ 2array ] compose '[ _ 2curry future ] { } assoc>map future-values
51 : parallel-assoc-map ( assoc quot: ( key value -- newkey newvalue ) -- newassoc )
52 over parallel-assoc-map-as ;
54 : 2parallel-map ( seq1 seq2 quot: ( elt1 elt2 -- newelt ) -- newseq )
55 '[ _ 2curry future ] 2map future-values ;
57 : parallel-product-map ( seq quot: ( elt -- newelt ) -- newseq )
58 [ <product-sequence> ] dip parallel-map ;
60 : parallel-cartesian-map ( seq1 seq2 quot: ( elt1 elt2 -- newelt ) -- newseq )
61 [ 2array ] dip [ first2-unsafe ] prepose parallel-product-map ;
65 : (parallel-spread) ( n -- spread-array )
66 [ ?future ] <repetition> ; inline
68 : (parallel-cleave) ( quots -- quot-array spread-array )
69 [ [future] ] map dup length (parallel-spread) ; inline
73 MACRO: parallel-cleave ( quots -- quot )
74 (parallel-cleave) '[ _ cleave _ spread ] ;
76 MACRO: parallel-spread ( quots -- quot )
77 (parallel-cleave) '[ _ spread _ spread ] ;
79 MACRO: parallel-napply ( quot n -- quot )
80 [ [future] ] dip dup (parallel-spread) '[ _ _ napply _ spread ] ;