sequences.extras: Add selector* which saves the output from the quotation

not the original value.
db4
Doug Coleman 2015-05-21 22:34:29 -07:00
parent c13b881517
commit a2913d6bd7
2 changed files with 15 additions and 0 deletions

View File

@ -26,6 +26,10 @@ IN: sequences.extras.tests
{ 0 0 0 0 } { 1 3 } over [ 1 + ] change-nths
] unit-test
{ V{ f t f } } [
{ 1 2 3 } [ even? ] selector* [ each ] dip
] unit-test
[ { 1 3 5 } ] [ { 1 2 3 4 5 6 } [ nip even? ] filter-index ] unit-test
[ V{ 1 3 5 } ] [ { 1 2 3 4 5 6 } [ nip even? ] V{ } filter-index-as ] unit-test

View File

@ -92,11 +92,17 @@ IN: sequences.extras
: push-if-index ( ..a elt i quot: ( ..a elt i -- ..b ? ) accum -- ..b )
[ 2keep drop ] dip rot [ push ] [ 2drop ] if ; inline
: push-if* ( ..a elt quot: ( ..a elt -- ..b obj/f ) accum -- ..b )
[ call ] dip [ push ] [ drop ] if* ; inline
<PRIVATE
: (index-selector-for) ( quot length exampler -- selector accum )
new-resizable [ [ push-if-index ] 2curry ] keep ; inline
: (selector-for*) ( quot length exemplar -- selector accum )
new-resizable [ [ push-if* ] 2curry ] keep ; inline
PRIVATE>
: index-selector-for ( quot exemplar -- selector accum )
@ -105,6 +111,11 @@ PRIVATE>
: index-selector ( quot -- selector accum )
V{ } index-selector-for ; inline
: selector-for* ( quot exemplar -- selector accum )
[ length ] keep (selector-for*) ; inline
: selector* ( quot -- selector accum ) V{ } selector-for* ; inline
: filter-index-as ( ... seq quot: ( ... elt i -- ... ? ) exemplar -- ... seq' )
pick length over [ (index-selector-for) [ each-index ] dip ] 2curry dip like ; inline