interval-sets: a little bit faster by not using slices.
parent
97e658fc17
commit
5a5c1b857f
|
@ -11,14 +11,6 @@ TUPLE: interval-set { array uint-array read-only } ;
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
ALIAS: start first-unsafe
|
|
||||||
ALIAS: end second-unsafe
|
|
||||||
|
|
||||||
: find-interval ( key interval-set -- slice )
|
|
||||||
array>> swap dupd [ >=< ] curry search drop
|
|
||||||
[ dup even? [ dup 1 + ] [ [ 1 - ] keep ] if rot <slice-unsafe> ]
|
|
||||||
[ drop f ] if* ; inline
|
|
||||||
|
|
||||||
ERROR: not-an-interval-set obj ;
|
ERROR: not-an-interval-set obj ;
|
||||||
|
|
||||||
: check-interval-set ( map -- map )
|
: check-interval-set ( map -- map )
|
||||||
|
@ -27,15 +19,20 @@ ERROR: not-an-interval-set obj ;
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
: in? ( key set -- ? )
|
: in? ( key set -- ? )
|
||||||
check-interval-set dupd find-interval
|
check-interval-set array>>
|
||||||
[ [ start ] [ end 1 - ] bi between? ]
|
over dupd [ >=< ] curry search drop [
|
||||||
[ drop f ] if* ;
|
dup even? [ dup 1 + ] [ [ 1 - ] keep ] if rot
|
||||||
|
[ nth-unsafe ] curry bi@ 1 - between?
|
||||||
|
] [ 2drop f ] if* ;
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
: spec>pairs ( sequence -- intervals )
|
: spec>pairs ( sequence -- intervals )
|
||||||
[ dup number? [ dup 2array ] when ] map ;
|
[ dup number? [ dup 2array ] when ] map ;
|
||||||
|
|
||||||
|
ALIAS: start first-unsafe
|
||||||
|
ALIAS: end second-unsafe
|
||||||
|
|
||||||
: disjoint? ( node1 node2 -- ? )
|
: disjoint? ( node1 node2 -- ? )
|
||||||
[ end ] [ start ] bi* < ;
|
[ end ] [ start ] bi* < ;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue