! Copyright (C) 2005, 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: arrays kernel math sequences strings sbufs ; IN: splitting : ?head ( seq begin -- newseq ? ) [ head? ] [ tail ] ?chomp ; : ?head-slice ( seq begin -- newseq ? ) [ head? ] [ tail-slice ] ?chomp ; : ?tail ( seq end -- newseq ? ) [ tail? ] [ head* ] ?chomp ; : ?tail-slice ( seq end -- newseq ? ) [ tail? ] [ head-slice* ] ?chomp ; : split1 ( seq subseq -- before after ) [ snip ] (split1) ; : split1-slice ( seq subseq -- before-slice after-slice ) [ snip-slice ] (split1) ; : split-subseq ( seq subseq -- seqs ) dup empty? [ drop 1array ] [ [ dup ] swap [ split1-slice swap ] curry produce nip ] if ; : replace ( seq old new -- new-seq ) pick [ [ split-subseq ] dip ] dip join-as ; : split1-when ( ... seq quot: ( ... elt -- ... ? ) -- ... before after ) [ snip ] (split1-when) ; inline : split1-when-slice ( ... seq quot: ( ... elt -- ... ? ) -- ... before-slice after-slice ) [ snip-slice ] (split1-when) ; inline : split1-last ( seq subseq -- before after ) [ ] bi@ split1 [ reverse ] bi@ dup [ swap ] when ; : split1-last-slice ( seq subseq -- before-slice after-slice ) [ ] bi@ split1-slice [ ] bi@ [ f ] [ swap ] if-empty ; : split-when ( ... seq quot: ( ... elt -- ... ? ) -- ... pieces ) [ 0 ] 2dip [ subseq ] (split) ; inline : split-when-slice ( ... seq quot: ( ... elt -- ... ? ) -- ... pieces ) [ 0 ] 2dip [ ] (split) ; inline : split ( seq separators -- pieces ) [ member? ] curry split-when ; inline : split-slice ( seq separators -- pieces ) [ member? ] curry split-when-slice ; inline GENERIC: string-lines ( str -- seq ) M: string string-lines dup [ "\r\n" member? ] any? [ "\n" split [ but-last-slice [ dup ?last CHAR: \r = [ but-last ] when [ CHAR: \r = ] split-when ] map! drop ] [ [ length 1 - ] keep [ [ CHAR: \r = ] split-when ] change-nth ] [ concat ] tri ] [ 1array ] if ; M: sbuf string-lines "" like string-lines ;