interval-sets: a little bit faster by not using slices.

db4
John Benediktsson 2014-05-19 09:28:01 -07:00
parent 97e658fc17
commit 5a5c1b857f
1 changed files with 8 additions and 11 deletions

View File

@ -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* < ;