1 USING: hints kernel math sequences sequences.private strings ;
6 : (split*) ( ... seq quot: ( ... elt -- ... ? ) slice-quot -- ... pieces )
8 swap curry [ [ 1 + ] when ] prepose [ 2keep ] curry
9 [ 2dup = ] prepose [ [ 1 + ] when swap ] compose [
10 [ find-from drop dup ] 2curry [ keep -rot ] curry
13 [ length [ swapd dupd < ] keep ] keep
14 ] dip 2curry [ suffix ] compose [ drop ] if ; inline
18 : split*-when ( ... seq quot: ( ... elt -- ... ? ) -- ... pieces )
19 [ subseq ] (split*) ; inline
21 : split*-when-slice ( ... seq quot: ( ... elt -- ... ? ) -- ... pieces )
22 [ <slice> ] (split*) ; inline
24 : split* ( seq separators -- pieces )
25 [ member? ] curry split*-when ; inline
27 : split*-slice ( seq separators -- pieces )
28 [ member? ] curry split*-when-slice ; inline
30 : split-find ( seq quot: ( seq -- i ) -- pieces )
31 [ dup empty? not ] swap [ [ dup ] ] dip
32 [ [ [ 1 ] when-zero cut-slice swap ] [ f swap ] if* ] compose
33 compose produce nip ; inline
35 : split-head ( seq quot -- before after )
36 (trim-head) cut ; inline
38 : split-tail ( seq quot -- before after )
39 (trim-tail) cut ; inline
41 : split-head-slice ( seq quot -- before after )
42 (trim-head) cut-slice ; inline
44 : split-tail-slice ( seq quot -- before after )
45 (trim-tail) cut-slice ; inline
49 :: (split-harvest) ( ... seq quot: ( ... elt -- ... ? ) slice-quot -- ... pieces )
50 seq [ quot call not ] find drop [
52 [ seq quot find-from drop ] keep swap
53 [ seq length ] unless* dup
56 [ seq slice-quot call ] keep swap
57 [ 1 + seq [ quot call not ] find-from drop ] dip
58 ] produce 2nip ; inline
62 : split-when-harvest ( ... seq quot: ( ... elt -- ... ? ) -- ... pieces )
63 [ subseq ] (split-harvest) ; inline
65 : split-when-slice-harvest ( ... seq quot: ( ... elt -- ... ? ) -- ... pieces )
66 [ <slice> ] (split-harvest) ; inline
68 : split-harvest ( seq separators -- pieces )
69 [ member? ] curry split-when-harvest ; inline
71 { split* split*-slice split-harvest }
72 [ { string string } set-specializer ] each