[ T{ bit-set f ?{ f } } T{ bit-set f ?{ t } } ]
[ 1 <bit-set> dup clone 0 over adjoin ] unit-test
+
+[ 0 ] [ T{ bit-set f ?{ } } cardinality ] unit-test
+[ 0 ] [ T{ bit-set f ?{ f f f f } } cardinality ] unit-test
+[ 1 ] [ T{ bit-set f ?{ f t f f } } cardinality ] unit-test
+[ 2 ] [ T{ bit-set f ?{ f t f t } } cardinality ] unit-test
over integer? [ table>> ?nth ] [ 2drop f ] if ; inline
M: bit-set adjoin
- ! This is allowed to crash when the elt couldn't go in the set
+ ! This is allowed to throw an error when the elt couldn't
+ ! go in the set
[ t ] 2dip table>> set-nth ;
M: bit-set delete
- ! This isn't allowed to crash if the elt wasn't in the set
+ ! This isn't allowed to throw an error if the elt wasn't
+ ! in the set
over integer? [
table>> 2dup bounds-check? [
[ f ] 2dip set-nth
] [ 2drop ] if
] [ 2drop ] if ;
-! If you do binary set operations with a bitset, it's expected
-! that the other thing can also be represented as a bitset
+! If you do binary set operations with a bit-set, it's expected
+! that the other thing can also be represented as a bit-set
! of the same length.
<PRIVATE
<PRIVATE
: bit-set-like ( set bit-set -- bit-set' )
- ! This crashes if there are keys that can't be put in the bit set
+ ! Throws an error if there are keys that can't be put
+ ! in the bit set
over bit-set? [ 2dup [ table>> length ] bi@ = ] [ f ] if
[ drop ] [
[ members ] dip table>> length <bit-set>
table>> clone bit-set boa ;
M: bit-set cardinality
- table>> bit-array>integer bit-count ;
+ table>> bit-count ;
{ $subsections in? }
"All sets can be represented as a sequence, without duplicates, of their members:"
{ $subsections members }
+"To get the number of elements in a set:"
+{ $subsections cardinality }
"Sets can have members added or removed destructively:"
{ $subsections
adjoin
HELP: cardinality
{ $values { "set" set } { "n" "a non-negative integer" } }
-{ $description "Returns the number of elements in the set. All sets support this operation." } ;
+{ $description "Returns the number of elements in the set. All sets support this operation." } ;
USING: sets tools.test kernel prettyprint hash-sets sorting ;
IN: sets.tests
-[ { } ] [ { } { } intersect ] unit-test
+[ { } ] [ { } { } intersect ] unit-test
[ { 2 3 } ] [ { 1 2 3 } { 2 3 4 } intersect ] unit-test
[ { 2 3 } ] [ { 1 2 2 3 } { 2 3 3 4 } intersect ] unit-test
[ { 1 } ] [ { 1 2 3 } { 2 3 4 } diff ] unit-test
[ { 1 } ] [ { 1 1 2 3 } { 2 3 4 4 } diff ] unit-test
-[ { } ] [ { } { } within ] unit-test
+[ { } ] [ { } { } within ] unit-test
[ { 2 3 } ] [ { 1 2 3 } { 2 3 4 } within ] unit-test
[ { 2 2 3 } ] [ { 1 2 2 3 } { 2 3 3 4 } within ] unit-test
[ 0 ] [ f cardinality ] unit-test
[ 0 ] [ { } cardinality ] unit-test
+[ 1 ] [ { 1 } cardinality ] unit-test
[ 1 ] [ HS{ 1 } cardinality ] unit-test
+[ 3 ] [ HS{ 1 2 3 } cardinality ] unit-test