: push-when ( ..a elt quot: ( ..a elt -- ..b ? ) accum -- ..b )
[ keep ] dip rot [ push ] [ 2drop ] if ; inline
+: 2push-when ( ..a elt1 elt2 quot: ( ..a elt1 elt2 -- ..b ? ) accum -- ..b )
+ [ keepd ] dip rot [ push ] [ 2drop ] if ; inline
+
: call-push-when ( ..a elt quot: ( ..a elt -- ..b elt' ? ) accum -- ..b )
[ call ] dip swap [ push ] [ 2drop ] if ; inline
: (selector-as) ( quot length exemplar -- selector accum )
new-resizable [ [ push-when ] 2curry ] keep ; inline
+: (2selector-as) ( quot length exemplar -- selector accum )
+ new-resizable [ [ 2push-when ] 2curry ] keep ; inline
+
PRIVATE>
: selector-as ( quot exemplar -- selector accum )
: filter-map ( ... seq filter-quot: ( ... elt -- ... ? ) map-quot: ( ... elt -- ... newelt ) -- ... newseq )
pick filter-map-as ; inline
+: 2filter-as ( ... seq1 seq2 quot: ( ... elt1 elt2 -- ... newelt ) exemplar -- ... newseq )
+ [
+ pick [ length ] keep
+ [ (2selector-as) [ 2each ] dip ] 2curry call
+ ] dip like ; inline
+
+: 2filter ( ... seq1 seq2 quot: ( ... elt1 elt2 -- ... newelt ) -- ... newseq )
+ pick 2filter-as ; inline
+
+: 2reject-as ( ... seq1 seq2 quot: ( ... elt1 elt2 -- ... newelt ) exemplar -- ... newseq )
+ [ [ not ] compose ] dip 2filter-as ; inline
+
+: 2reject ( ... seq1 seq2 quot: ( ... elt1 elt2 -- ... newelt ) -- ... newseq )
+ pick 2reject-as ; inline
+
: 2map-sum ( ... seq1 seq2 quot: ( ... elt1 elt2 -- ... n ) -- ... n )
[ 0 ] 3dip [ dip + ] curry [ rot ] prepose 2each ; inline