{ 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
: 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 )
: 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