It's similar to reject! but returns the items that were removed.
{ 0 } [ { 1 2 3 4 } [ 5 > ] count-tail ] unit-test
{ 2 } [ { 1 2 3 4 } [ 2 > ] count-tail ] unit-test
{ 4 } [ { 1 2 3 4 } [ 5 < ] count-tail ] unit-test
+
+{ SBUF" aco" SBUF" ftr" } [ SBUF" factor" dup [ even? ] extract! ] unit-test
: interleaved ( seq glue -- newseq )
over interleaved-as ;
+
+: extract! ( ... seq quot: ( ... elt -- ... ? ) -- ... seq )
+ [ dup ] compose over [ length ] keep new-resizable
+ [ [ push-if ] 2curry reject! ] keep swap like ; inline