diff --git a/extra/sequences/extras/extras-tests.factor b/extra/sequences/extras/extras-tests.factor index 27e73e954b..45f08db319 100644 --- a/extra/sequences/extras/extras-tests.factor +++ b/extra/sequences/extras/extras-tests.factor @@ -1,4 +1,4 @@ -USING: kernel make math sequences sequences.extras tools.test ; +USING: ascii kernel make math sequences sequences.extras tools.test ; IN: sequences.extras.tests @@ -33,3 +33,15 @@ 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 diff --git a/extra/sequences/extras/extras.factor b/extra/sequences/extras/extras.factor index 1a5fd293b6..10a743e868 100644 --- a/extra/sequences/extras/extras.factor +++ b/extra/sequences/extras/extras.factor @@ -1,5 +1,5 @@ USING: arrays grouping kernel locals math math.order math.ranges -sequences ; +sequences splitting ; IN: sequences.extras @@ -81,3 +81,17 @@ 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