]> gitweb.factorcode.org Git - factor.git/blob - core/splitting/splitting.factor
core/basis: trim down using lists
[factor.git] / core / splitting / splitting.factor
1 ! Copyright (C) 2005, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: arrays kernel make math sequences sets strings ;
4 IN: splitting
5
6 <PRIVATE
7
8 : ?chomp ( seq begin tester chopper -- newseq ? )
9     [ [ 2dup ] dip call ] dip
10     [ [ length ] dip call t ] curry
11     [ drop f ] if ; inline
12
13 PRIVATE>
14
15 : ?head ( seq begin -- newseq ? )
16     [ head? ] [ tail ] ?chomp ;
17
18 : ?head-slice ( seq begin -- newseq ? )
19     [ head? ] [ tail-slice ] ?chomp ;
20
21 : ?tail ( seq end -- newseq ? )
22     [ tail? ] [ head* ] ?chomp ;
23
24 : ?tail-slice ( seq end -- newseq ? )
25     [ tail? ] [ head-slice* ] ?chomp ;
26
27 <PRIVATE
28
29 : (split1) ( seq subseq quot -- before after )
30     [
31         swap [
32             [ drop length ] [ start dup ] 2bi
33             [ [ nip ] [ + ] 2bi t ]
34             [ 2drop f f f ]
35             if
36         ] keep swap
37     ] dip [ 2nip f ] if ; inline
38
39 PRIVATE>
40
41 : split1 ( seq subseq -- before after )
42     [ snip ] (split1) ;
43
44 : split1-slice ( seq subseq -- before-slice after-slice )
45     [ snip-slice ] (split1) ;
46
47 : split1-last ( seq subseq -- before after )
48     [ <reversed> ] bi@ split1 [ reverse ] bi@
49     dup [ swap ] when ;
50
51 : split1-last-slice ( seq subseq -- before-slice after-slice )
52     [ <reversed> ] bi@ split1-slice [ <reversed> ] bi@
53     [ f ] [ swap ] if-empty ;
54
55 <PRIVATE
56
57 : (split) ( n seq quot: ( ... elt -- ... ? ) -- )
58     [ find-from drop ]
59     [ [ [ 3dup swapd subseq , ] dip [ drop 1 + ] 2dip (split) ] 3curry ]
60     [ drop [ swap [ tail ] unless-zero , ] 2curry ]
61     3tri if* ; inline recursive
62
63 : split, ( ... seq quot: ( ... elt -- ... ? ) -- ... ) [ 0 ] 2dip (split) ; inline
64
65 PRIVATE>
66
67 : split ( seq separators -- pieces )
68     [ [ member? ] curry split, ] { } make ;
69
70 : split-when ( ... seq quot: ( ... elt -- ... ? ) -- ... pieces )
71     [ split, ] { } make ; inline
72
73 GENERIC: string-lines ( str -- seq )
74
75 M: string string-lines
76     dup "\r\n" intersects? [
77         "\n" split [
78             but-last-slice [
79                 "\r" ?tail drop "\r" split
80             ] map
81         ] keep last "\r" split suffix concat
82     ] [
83         1array
84     ] if ;