1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs sequences sorting binary-search math
4 math.order arrays combinators kernel ;
10 { first read-only } { second read-only } ;
13 [ first>> length ] [ second>> length ] bi + ; inline
15 M: simple-cord virtual-seq first>> ; inline
17 M: simple-cord virtual@
19 [ first>> ] [ [ first>> length - ] [ second>> ] bi ] if ; inline
22 { count read-only } { seqs read-only } ;
24 M: multi-cord length count>> ; inline
26 M: multi-cord virtual@
28 seqs>> [ first <=> ] with search nip
29 [ first - ] [ second ] bi ; inline
31 M: multi-cord virtual-seq
32 seqs>> [ f ] [ first second ] if-empty ; inline
34 : <cord> ( seqs -- cord )
36 first2 simple-cord boa
38 [ 0 [ length + ] accumulate ] keep zip multi-cord boa
43 UNION: cord simple-cord multi-cord ;
45 INSTANCE: cord virtual-sequence
47 INSTANCE: multi-cord virtual-sequence
49 : cord-append ( seq1 seq2 -- cord )
51 { [ over empty? ] [ nip ] }
52 { [ dup empty? ] [ drop ] }
53 { [ 2dup [ cord? ] both? ] [ [ seqs>> values ] bi@ append <cord> ] }
54 { [ over cord? ] [ [ seqs>> values ] dip suffix <cord> ] }
55 { [ dup cord? ] [ seqs>> values swap prefix <cord> ] }
59 : cord-concat ( seqs -- cord )
61 { [ dup empty? ] [ drop f ] }
62 { [ dup length 1 = ] [ first ] }
66 { [ dup cord? ] [ seqs>> values ] }
67 { [ dup empty? ] [ drop { } ] }