]> gitweb.factorcode.org Git - factor.git/commitdiff
interval-sets: a little bit faster by not using slices.
authorJohn Benediktsson <mrjbq7@gmail.com>
Mon, 19 May 2014 16:28:01 +0000 (09:28 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Mon, 19 May 2014 16:28:01 +0000 (09:28 -0700)
basis/interval-sets/interval-sets.factor

index c547b874837241705ab8f062d098fc5f1271db07..62f9b479698bb14e283803d9a3a8a1136daf68a2 100644 (file)
@@ -11,14 +11,6 @@ TUPLE: interval-set { array uint-array read-only } ;
 
 <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 ;
 
 : check-interval-set ( map -- map )
@@ -27,15 +19,20 @@ ERROR: not-an-interval-set obj ;
 PRIVATE>
 
 : in? ( key set -- ? )
-    check-interval-set dupd find-interval
-    [ [ start ] [ end 1 - ] bi between? ]
-    [ drop f ] if* ;
+    check-interval-set array>>
+    over dupd [ >=< ] curry search drop [
+        dup even? [ dup 1 + ] [ [ 1 - ] keep ] if rot
+        [ nth-unsafe ] curry bi@ 1 - between?
+    ] [ 2drop f ] if* ;
 
 <PRIVATE
 
 : spec>pairs ( sequence -- intervals )
     [ dup number? [ dup 2array ] when ] map ;
 
+ALIAS: start first-unsafe
+ALIAS: end second-unsafe
+
 : disjoint? ( node1 node2 -- ? )
     [ end ] [ start ] bi* < ;