Virtual sequence concatenation
parent
313bd9b154
commit
3733624dcf
|
@ -0,0 +1 @@
|
||||||
|
Slava Pestov
|
|
@ -0,0 +1,5 @@
|
||||||
|
IN: cords.tests
|
||||||
|
USING: cords strings tools.test kernel sequences ;
|
||||||
|
|
||||||
|
[ "hello world" ] [ "hello" " world" cord-append dup like ] unit-test
|
||||||
|
[ "hello world" ] [ { "he" "llo" " world" } cord-concat dup like ] unit-test
|
|
@ -0,0 +1,70 @@
|
||||||
|
! Copysecond (C) 2008 Slava Pestov.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: accessors assocs sequences sorting math math.order
|
||||||
|
arrays combinators kernel ;
|
||||||
|
IN: cords
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
|
TUPLE: simple-cord first second ;
|
||||||
|
|
||||||
|
M: simple-cord length
|
||||||
|
[ first>> length ] [ second>> length ] bi + ;
|
||||||
|
|
||||||
|
M: simple-cord virtual-seq first>> ;
|
||||||
|
|
||||||
|
M: simple-cord virtual@
|
||||||
|
2dup first>> length <
|
||||||
|
[ first>> ] [ [ first>> length - ] [ second>> ] bi ] if ;
|
||||||
|
|
||||||
|
TUPLE: multi-cord count seqs ;
|
||||||
|
|
||||||
|
M: multi-cord length count>> ;
|
||||||
|
|
||||||
|
M: multi-cord virtual@
|
||||||
|
dupd
|
||||||
|
seqs>> [ first <=> ] binsearch*
|
||||||
|
[ first - ] [ second ] bi ;
|
||||||
|
|
||||||
|
M: multi-cord virtual-seq
|
||||||
|
seqs>> dup empty? [ drop f ] [ first second ] if ;
|
||||||
|
|
||||||
|
: <cord> ( seqs -- cord )
|
||||||
|
dup length 2 = [
|
||||||
|
first2 simple-cord boa
|
||||||
|
] [
|
||||||
|
[ 0 [ length + ] accumulate ] keep zip multi-cord boa
|
||||||
|
] if ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
|
UNION: cord simple-cord multi-cord ;
|
||||||
|
|
||||||
|
INSTANCE: cord virtual-sequence
|
||||||
|
|
||||||
|
INSTANCE: multi-cord virtual-sequence
|
||||||
|
|
||||||
|
: cord-append ( seq1 seq2 -- cord )
|
||||||
|
{
|
||||||
|
{ [ over empty? ] [ nip ] }
|
||||||
|
{ [ dup empty? ] [ drop ] }
|
||||||
|
{ [ 2dup [ cord? ] both? ] [ [ seqs>> values ] bi@ append <cord> ] }
|
||||||
|
{ [ over cord? ] [ [ seqs>> values ] dip suffix <cord> ] }
|
||||||
|
{ [ dup cord? ] [ seqs>> values swap prefix <cord> ] }
|
||||||
|
[ 2array <cord> ]
|
||||||
|
} cond ;
|
||||||
|
|
||||||
|
: cord-concat ( seqs -- cord )
|
||||||
|
{
|
||||||
|
{ [ dup empty? ] [ drop f ] }
|
||||||
|
{ [ dup length 1 = ] [ first ] }
|
||||||
|
[
|
||||||
|
[
|
||||||
|
{
|
||||||
|
{ [ dup cord? ] [ seqs>> values ] }
|
||||||
|
{ [ dup empty? ] [ drop { } ] }
|
||||||
|
[ 1array ]
|
||||||
|
} cond
|
||||||
|
] map concat <cord>
|
||||||
|
]
|
||||||
|
} cond ;
|
|
@ -0,0 +1 @@
|
||||||
|
Virtual sequence concatenation
|
|
@ -0,0 +1 @@
|
||||||
|
collections
|
Loading…
Reference in New Issue