M: hash-set adjoin table>> dupd set-at ; inline
M: hash-set delete table>> delete-at ; inline
M: hash-set members table>> keys ; inline
-M: hash-set set-like drop dup hash-set? [ members >hash-set ] unless ;
+M: hash-set set-like drop dup hash-set? [ ?members >hash-set ] unless ;
M: hash-set clone table>> clone hash-set boa ;
M: hash-set null? table>> assoc-empty? ;
M: hash-set cardinality table>> assoc-size ;
M: hash-set intersect small/large sequence/tester filter >hash-set ;
-M: hash-set union [ members ] bi@ append >hash-set ;
+M: hash-set union (union) >hash-set ;
M: hash-set diff sequence/tester [ not ] compose filter >hash-set ;
M: sequence fast-set >hash-set ;
M: f fast-set drop H{ } clone hash-set boa ;
M: sequence duplicates
- f fast-set [ ?adjoin not ] curry filter ;
+ dup length <hash-set> [ ?adjoin not ] curry filter ;
<PRIVATE
M: set set-like drop ; inline
+<PRIVATE
+
+: ?members ( set -- seq )
+ dup sequence? [ members ] unless ; inline
+
+: (union) ( set1 set2 -- seq )
+ [ ?members ] bi@ append ; inline
+
+PRIVATE>
+
M: set union
- [ [ members ] bi@ append ] keep set-like ;
+ [ (union) ] keep set-like ;
<PRIVATE
empty? ; inline
M: sequence cardinality
- pruned length ;
+ fast-set cardinality ;
: combine ( sets -- set/f )
[ f ]
- [ [ [ members ] map concat ] [ first ] bi set-like ]
+ [ [ [ ?members ] map concat ] [ first ] bi set-like ]
if-empty ;
: gather ( ... seq quot: ( ... elt -- ... elt' ) -- ... newseq )