sequences.product: adding product-find.

fix-linux
John Benediktsson 2019-12-13 19:30:22 -08:00
parent 6be39382a3
commit 2d1da05bc5
3 changed files with 25 additions and 2 deletions

View File

@ -58,7 +58,12 @@ HELP: product-each
{ $description "Calls " { $snippet "quot" } " for every element of the cartesian product of " { $snippet "sequences" } "." }
{ $notes { $snippet "[ ... ] product-each" } " is equivalent to, but more efficient than, " { $snippet "<product-sequence> [ ... ] each" } "." } ;
{ product-map product-each } related-words
HELP: product-find
{ $values { "sequences" sequence } { "quot" { $quotation ( ... seq -- ... ? ) } } { "sequence" sequence } }
{ $description "Calls " { $snippet "quot" } " for every element of the cartesian product of " { $snippet "sequences" } ", returning the first sequence where the quotation returns a true value." }
{ $notes { $snippet "[ ... ] product-each" } " is equivalent to, but more efficient than, " { $snippet "<product-sequence> [ ... ] find" } "." } ;
{ product-map product-each product-find } related-words
ARTICLE: "sequences.product" "Product sequences"
"The " { $vocab-link "sequences.product" } " vocabulary provides a virtual sequence and combinators for manipulating the cartesian product of a set of sequences."
@ -69,6 +74,7 @@ ARTICLE: "sequences.product" "Product sequences"
product-map-as
product-map>assoc
product-each
product-find
} ;
ABOUT: "sequences.product"

View File

@ -1,6 +1,6 @@
! Copyright (C) 2009 Joe Groff.
! See http://factorcode.org/license.txt for BSD license.
USING: arrays kernel make sequences sequences.product tools.test ;
USING: arrays kernel make math sequences sequences.product tools.test ;
{ { { 0 "a" } { 1 "a" } { 2 "a" } { 0 "b" } { 1 "b" } { 2 "b" } } }
[ { { 0 1 2 } { "a" "b" } } <product-sequence> >array ] unit-test
@ -24,3 +24,13 @@ USING: arrays kernel make sequences sequences.product tools.test ;
{ { } } [ { { } { 1 } } [ ] product-map ] unit-test
{ } [ { { } { 1 } } [ drop ] product-each ] unit-test
{ { 2 4 8 } } [
{ { 1 2 3 } { 4 5 6 } { 7 8 9 } }
[ [ even? ] all? ] product-find
] unit-test
{ f } [
{ { 1 2 3 } { 4 5 6 } { 7 8 9 } }
[ [ 10 > ] all? ] product-find
] unit-test

View File

@ -78,3 +78,10 @@ M: product-sequence nth
sequences [ quot call 2array i result set-nth-unsafe i 1 + i! ] product-each
result
] new-like exemplar assoc-like ; inline
:: product-find ( ... sequences quot: ( ... seq -- ... ? ) -- ... sequence )
sequences start-product-iter :> ( ns lengths )
lengths [ 0 = ] any? [
f [ ns lengths end-product-iter? over or ]
[ drop ns sequences nths quot keep and ns lengths product-iter ] until
] unless ; inline