]> gitweb.factorcode.org Git - factor.git/commitdiff
sets: make intersect, intersects?, and subset? faster.
authorJohn Benediktsson <mrjbq7@gmail.com>
Wed, 29 Dec 2010 12:53:22 +0000 (04:53 -0800)
committerJohn Benediktsson <mrjbq7@gmail.com>
Wed, 29 Dec 2010 12:53:22 +0000 (04:53 -0800)
core/sets/sets-tests.factor
core/sets/sets.factor

index e271dc3d2287fb750aa3753c03aec4457b5654f8..f78fdb069404a73d652c94afa1fea40cf7153abd 100644 (file)
@@ -5,10 +5,14 @@ IN: sets.tests
 
 [ { } ] [ { } { } intersect  ] unit-test
 [ { 2 3 } ] [ { 1 2 3 } { 2 3 4 } intersect ] unit-test
+[ { 2 3 } ] [ { 1 2 3 } { 2 3 4 5 } intersect ] unit-test
+[ { 2 3 4 } ] [ { 1 2 3 4 } { 2 3 4 } intersect ] unit-test
 [ { 2 3 } ] [ { 1 2 2 3 } { 2 3 3 4 } intersect ] unit-test
 
 [ { } ] [ { } { } diff ] unit-test
 [ { 1 } ] [ { 1 2 3 } { 2 3 4 } diff ] unit-test
+[ { 1 } ] [ { 1 2 3 } { 2 3 4 5 } diff ] unit-test
+[ { 1 } ] [ { 1 2 3 4 } { 2 3 4 } diff ] unit-test
 [ { 1 } ] [ { 1 1 2 3 } { 2 3 4 4 } diff ] unit-test
 
 [ { } ] [ { } { } within  ] unit-test
index a73515ca910e65a4db1542fa2374a16a962d9b33..904d0d95d78f04ace224504cc7e7e68cf169441e 100644 (file)
@@ -46,19 +46,22 @@ M: set union
 : sequence/tester ( set1 set2 -- set1' quot )
     [ members ] [ tester ] bi* ; inline
 
+: small/large ( set1 set2 -- set1' set2' )
+    2dup [ cardinality ] bi@ > [ swap ] when ;
+
 PRIVATE>
 
 M: set intersect
-    [ sequence/tester filter ] keep set-like ;
+    [ small/large sequence/tester filter ] keep set-like ;
 
 M: set diff
     [ sequence/tester [ not ] compose filter ] keep set-like ;
 
 M: set intersects?
-    sequence/tester any? ;
+    small/large sequence/tester any? ;
 
 M: set subset?
-    sequence/tester all? ;
+    small/large sequence/tester all? ;
 
 M: set set=
     2dup [ cardinality ] bi@ = [ subset? ] [ 2drop f ] if ;