diff --git a/basis/concurrency/combinators/combinators-docs.factor b/basis/concurrency/combinators/combinators-docs.factor index e0071ce8dd..d909ddbeba 100644 --- a/basis/concurrency/combinators/combinators-docs.factor +++ b/basis/concurrency/combinators/combinators-docs.factor @@ -34,10 +34,16 @@ $nl parallel-each 2parallel-each parallel-map - parallel-product-map 2parallel-map parallel-filter } +"Concurrent product sequence combinators:" +{ $subsections + parallel-product-each + parallel-cartesian-each + parallel-product-map + parallel-cartesian-map +} "Concurrent cleave combinators:" { $subsections parallel-cleave diff --git a/basis/concurrency/combinators/combinators.factor b/basis/concurrency/combinators/combinators.factor index 537b9c043d..9e460619db 100644 --- a/basis/concurrency/combinators/combinators.factor +++ b/basis/concurrency/combinators/combinators.factor @@ -1,7 +1,8 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: combinators concurrency.count-downs concurrency.futures -fry generalizations kernel macros sequences sequences.product ; +USING: arrays combinators concurrency.count-downs +concurrency.futures fry generalizations kernel macros sequences +sequences.private sequences.product ; IN: concurrency.combinators '[ _ 2curry _ spawn-stage ] 2each ] (parallel-each) ; inline +: parallel-product-each ( seq quot: ( elt -- ) -- ) + [ ] dip parallel-each ; + +: parallel-cartesian-each ( seq1 seq2 quot: ( elt1 elt2 -- ) -- ) + [ 2array ] dip [ first2-unsafe ] prepose parallel-product-each ; + : parallel-filter ( seq quot: ( elt -- ? ) -- newseq ) over [ selector [ parallel-each ] dip ] dip like ; inline @@ -36,11 +43,14 @@ PRIVATE> : parallel-map ( seq quot: ( elt -- newelt ) -- newseq ) [future] map future-values ; inline +: 2parallel-map ( seq1 seq2 quot: ( elt1 elt2 -- newelt ) -- newseq ) + '[ _ 2curry future ] 2map future-values ; + : parallel-product-map ( seq quot: ( elt -- newelt ) -- newseq ) [ ] dip parallel-map ; -: 2parallel-map ( seq1 seq2 quot: ( elt1 elt2 -- newelt ) -- newseq ) - '[ _ 2curry future ] 2map future-values ; +: parallel-cartesian-map ( seq1 seq2 quot: ( elt1 elt2 -- newelt ) -- newseq ) + [ 2array ] dip [ first2-unsafe ] prepose parallel-product-map ;