diff --git a/basis/concurrency/combinators/combinators-docs.factor b/basis/concurrency/combinators/combinators-docs.factor index c3389a1aec..e0071ce8dd 100644 --- a/basis/concurrency/combinators/combinators-docs.factor +++ b/basis/concurrency/combinators/combinators-docs.factor @@ -7,7 +7,7 @@ HELP: parallel-map { $errors "Throws an error if one of the iterations throws an error." } ; HELP: 2parallel-map -{ $values { "seq1" sequence } { "seq2" sequence } { "quot" { $quotation "( elt -- newelt )" } } { "newseq" sequence } } +{ $values { "seq1" sequence } { "seq2" sequence } { "quot" { $quotation "( elt1 elt2 -- newelt )" } } { "newseq" sequence } } { $description "Spawns a new thread for applying " { $snippet "quot" } " to pairwise elements of " { $snippet "seq1" } " and " { $snippet "seq2" } ", collecting the results at the end." } { $errors "Throws an error if one of the iterations throws an error." } ; @@ -17,7 +17,7 @@ HELP: parallel-each { $errors "Throws an error if one of the iterations throws an error." } ; HELP: 2parallel-each -{ $values { "seq1" sequence } { "seq2" sequence } { "quot" { $quotation "( elt -- )" } } } +{ $values { "seq1" sequence } { "seq2" sequence } { "quot" { $quotation "( elt1 elt2 -- )" } } } { $description "Spawns a new thread for applying " { $snippet "quot" } " to pairwise elements of " { $snippet "seq1" } " and " { $snippet "seq2" } ", blocking until all quotations complete." } { $errors "Throws an error if one of the iterations throws an error." } ; @@ -34,6 +34,7 @@ $nl parallel-each 2parallel-each parallel-map + parallel-product-map 2parallel-map parallel-filter } diff --git a/basis/concurrency/combinators/combinators.factor b/basis/concurrency/combinators/combinators.factor index 306242d3ac..537b9c043d 100644 --- a/basis/concurrency/combinators/combinators.factor +++ b/basis/concurrency/combinators/combinators.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: concurrency.futures concurrency.count-downs sequences -kernel macros fry combinators generalizations ; +USING: combinators concurrency.count-downs concurrency.futures +fry generalizations kernel macros sequences sequences.product ; IN: concurrency.combinators -: parallel-each ( seq quot -- ) +: parallel-each ( seq quot: ( elt -- ) -- ) over length [ '[ _ curry _ spawn-stage ] each ] (parallel-each) ; inline -: 2parallel-each ( seq1 seq2 quot -- ) +: 2parallel-each ( seq1 seq2 quot: ( elt1 elt2 -- ) -- ) 2over min-length [ '[ _ 2curry _ spawn-stage ] 2each ] (parallel-each) ; inline -: parallel-filter ( seq quot -- newseq ) +: parallel-filter ( seq quot: ( elt -- ? ) -- newseq ) over [ selector [ parallel-each ] dip ] dip like ; inline PRIVATE> -: parallel-map ( seq quot -- newseq ) +: parallel-map ( seq quot: ( elt -- newelt ) -- newseq ) [future] map future-values ; inline -: 2parallel-map ( seq1 seq2 quot -- newseq ) +: 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 ;