{ "hello" "world-+." } [ "hello-+world-+." "-+" split1 ] unit-test
{ "goodbye" f } [ "goodbye" " " split1 ] unit-test
{ "" "" } [ "great" "great" split1 ] unit-test
+{ { 1 2 3 } f } [ { 1 2 3 } { 5 6 } split1 ] unit-test
{ "hello world" "." } [ "hello world ." " " split1-last ] unit-test
{ "hello-+world" "." } [ "hello-+world-+." "-+" split1-last ] unit-test
{ "goodbye" f } [ "goodbye" " " split1-last ] unit-test
{ "" "" } [ "great" "great" split1-last ] unit-test
+{ { 1 2 3 } f } [ { 1 2 3 } { 5 6 } split1-last ] unit-test
{ "hello world" "." } [ "hello world ." " " split1-last-slice [ >string ] bi@ ] unit-test
{ "hello-+world" "." } [ "hello-+world-+." "-+" split1-last-slice [ >string ] bi@ ] unit-test
: ?tail-slice ( seq end -- newseq ? )
[ tail? ] [ head-slice* ] ?chomp ;
-<PRIVATE
-
: subseq-range ( seq subseq -- from/f to/f )
- [ subseq-index ] keep [ dupd length + ] curry [ f f ] if* ; inline
+ tuck subseq-index [ dup rot length + ] [ drop f f ] if* ;
-: (split1) ( seq subseq snip-quot -- before after )
- [ [ subseq-range ] keepd over ] dip [ 2nip f ] if ; inline
+: ?snip ( from/f to/f seq -- before after )
+ over [ snip ] [ 2nip f ] if ; inline
-PRIVATE>
+: ?snip-slice ( from/f to/f seq -- before after )
+ over [ snip-slice ] [ 2nip f ] if ; inline
: split1 ( seq subseq -- before after )
- [ snip ] (split1) ;
+ [ subseq-range ] keepd ?snip ; inline
: split1-slice ( seq subseq -- before-slice after-slice )
- [ snip-slice ] (split1) ;
+ [ subseq-range ] keepd ?snip-slice ; inline
: split-subseq ( seq subseq -- seqs )
[
: replace ( seq old new -- new-seq )
pick [ [ split-subseq ] dip ] dip join-as ;
-<PRIVATE
-
-: (split1-when) ( ... seq quot: ( ... elt -- ... ? ) snip-quot -- ... before-slice after-slice )
- [ dupd find drop ] dip [ swap [ dup 1 + ] dip ] prepose [ f ] if* ; inline
-
-PRIVATE>
-
: split1-when ( ... seq quot: ( ... elt -- ... ? ) -- ... before after )
- [ snip ] (split1-when) ; inline
+ [ find drop ] keepd swap [ dup 1 + rot snip ] [ f ] if* ; inline
: split1-when-slice ( ... seq quot: ( ... elt -- ... ? ) -- ... before-slice after-slice )
- [ snip-slice ] (split1-when) ; inline
+ [ find drop ] keepd swap [ dup 1 + rot snip-slice ] [ f ] if* ; inline
: split1-last ( seq subseq -- before after )
[ <reversed> ] bi@ split1 [ reverse ] bi@