2013-03-06 12:59:37 -05:00
|
|
|
! Copyright (C) 2013 Doug Coleman.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2016-11-18 09:59:07 -05:00
|
|
|
USING: assocs fry hash-sets kernel locals sequences
|
2014-06-03 13:13:51 -04:00
|
|
|
sequences.extras sets ;
|
2013-03-06 12:59:37 -05:00
|
|
|
IN: sets.extras
|
|
|
|
|
2013-04-09 13:37:50 -04:00
|
|
|
: setwise-xor ( seq1 seq2 -- set )
|
2013-03-06 12:59:37 -05:00
|
|
|
[ append members ] [ intersect ] 2bi diff ;
|
2013-04-09 13:37:50 -04:00
|
|
|
|
|
|
|
: symmetric-diff ( set1 set2 -- set )
|
|
|
|
[ union ] [ intersect ] 2bi diff ;
|
|
|
|
|
|
|
|
: proper-subset? ( set1 set2 -- ? )
|
|
|
|
2dup subset? [ swap subset? not ] [ 2drop f ] if ;
|
2013-04-24 10:58:50 -04:00
|
|
|
|
|
|
|
: superset? ( set1 set2 -- ? )
|
|
|
|
swap subset? ;
|
|
|
|
|
|
|
|
: disjoint? ( set1 set2 -- ? )
|
|
|
|
intersects? not ;
|
2013-05-02 19:36:43 -04:00
|
|
|
|
|
|
|
:: non-repeating ( seq -- seq' )
|
|
|
|
HS{ } clone :> visited
|
|
|
|
0 seq new-resizable :> accum
|
|
|
|
seq [
|
|
|
|
accum over visited ?adjoin
|
2013-06-14 14:02:30 -04:00
|
|
|
[ push ] [ remove-first! drop ] if
|
2013-05-02 19:36:43 -04:00
|
|
|
] each accum seq like ;
|
2013-10-10 12:53:04 -04:00
|
|
|
|
|
|
|
: adjoin-at* ( value key assoc -- set )
|
|
|
|
[ [ HS{ } clone ] unless* [ adjoin ] keep dup ] change-at ;
|
2014-06-03 13:13:51 -04:00
|
|
|
|
|
|
|
: mapped-set ( ... seq quot: ( ... elt -- ... newelt ) -- ... set )
|
|
|
|
over length <hash-set> [
|
2016-11-18 09:59:07 -05:00
|
|
|
'[ @ _ adjoin ] each
|
2014-06-03 13:13:51 -04:00
|
|
|
] keep ; inline
|
2016-11-18 09:59:07 -05:00
|
|
|
|
|
|
|
: duplicates-by ( seq quot: ( elt -- key ) -- seq' )
|
|
|
|
over length <hash-set> '[ @ _ ?adjoin ] filter ; inline
|