! Copyright (C) 2013 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
-USING: kernel locals sequences sets ;
+USING: assocs hash-sets kernel sequences sequences.extras
+sets ;
IN: sets.extras
: setwise-xor ( seq1 seq2 -- set )
0 seq new-resizable :> accum
seq [
accum over visited ?adjoin
- [ push ] [ remove! drop ] if
+ [ push ] [ remove-first! drop ] if
] each accum seq like ;
+
+: adjoin-at* ( value key assoc -- set )
+ [ [ HS{ } clone ] unless* [ adjoin ] keep dup ] change-at ;
+
+: mapped-set ( ... seq quot: ( ... elt -- ... newelt ) -- ... set )
+ over length <hash-set> [
+ '[ @ _ adjoin ] each
+ ] keep ; inline
+
+: unique-by ( seq quot: ( elt -- key ) -- seq' )
+ over length <hash-set> '[ @ _ ?adjoin ] filter ; inline