-USING: kernel make math sequences sequences.extras tools.test ;
+USING: ascii kernel make math sequences sequences.extras tools.test ;
IN: sequences.extras.tests
] 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
+
+[ { 1 3 5 } ] [ { 1 2 3 4 5 6 } even-indices ] unit-test
+
+[ { 2 4 6 } ] [ { 1 2 3 4 5 6 } odd-indices ] unit-test
+
+{ "a b c d e" }
+[ "a b \t \n \r c d \n e " [ blank? ] " " compact ] unit-test
+
+{ " a b c d e " }
+[ " a b c d e " [ blank? ] " " collapse ] unit-test
USING: arrays grouping kernel locals math math.order math.ranges
-sequences ;
+sequences splitting ;
IN: sequences.extras
: filter-index ( ... seq quot: ( ... elt i -- ... ? ) -- ... seq' )
over filter-index-as ; inline
+
+: even-indices ( seq -- seq' ) [ nip even? ] filter-index ;
+
+: odd-indices ( seq -- seq' ) [ nip odd? ] filter-index ;
+
+: compact ( seq quot elt -- seq' )
+ [ split-when harvest ] dip join ; inline
+
+: collapse ( seq quot elt -- seq' )
+ [ split-when ] dip
+ [ [ harvest ] dip join ]
+ [ [ first empty? ] dip [ prepend ] curry when ]
+ [ [ last empty? ] dip [ append ] curry when ]
+ 2tri ; inline