[ { } ] [ { } { } 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
: 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 ;