[ { 1 2 3 } ] [ { 1 2 2 3 3 } { } set-like ] unit-test
[ { 3 2 1 } ] [ { 3 3 2 2 1 } { } set-like ] unit-test
-[ { 1 2 1 } ] [ { 1 2 3 2 1 2 1 } duplicates ] unit-test
+[ { 2 1 2 1 } ] [ { 1 2 3 2 1 2 1 } duplicates ] unit-test
[ f ] [ HS{ 1 2 3 1 2 1 } duplicates ] unit-test
+
+[ H{ { 3 HS{ 1 2 } } } ] [ H{ } clone 1 3 pick adjoin-at 2 3 pick adjoin-at ] unit-test
<PRIVATE
: (prune) ( elt hash vec -- )
- 3dup drop key? [ 3drop ] [
- [ drop dupd set-at ] [ nip push ] 3bi
+ 3dup drop in? [ 3drop ] [
+ [ drop adjoin ] [ nip push ] 3bi
] if ; inline
: prune ( seq -- newseq )
- [ ] [ length <hashtable> ] [ length <vector> ] tri
+ [ f fast-set ] [ length <vector> ] bi
[ [ (prune) ] 2curry each ] keep ;
PRIVATE>
: combine ( sets -- set )
f [ union ] reduce ;
+
+: gather ( seq quot -- newseq )
+ map concat members ; inline
+
+: adjoin-at ( value key assoc -- )
+ [ [ f fast-set ] unless* [ adjoin ] keep ] change-at ;