1 ! Copyright (C) 2010 Daniel Ehrenberg
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs hashtables kernel vectors
9 GENERIC: adjoin ( elt set -- )
10 GENERIC: in? ( elt set -- ? )
11 GENERIC: delete ( elt set -- )
12 GENERIC: set-like ( set exemplar -- set' )
13 GENERIC: fast-set ( set -- set' )
14 GENERIC: members ( set -- sequence )
15 GENERIC: union ( set1 set2 -- set )
16 GENERIC: intersect ( set1 set2 -- set )
17 GENERIC: intersects? ( set1 set2 -- ? )
18 GENERIC: diff ( set1 set2 -- set )
19 GENERIC: subset? ( set1 set2 -- ? )
20 GENERIC: set= ( set1 set2 -- ? )
21 GENERIC: duplicates ( set -- sequence )
22 GENERIC: all-unique? ( set -- ? )
24 ! Defaults for some methods.
25 ! Override them for efficiency
28 [ [ members ] bi@ append ] keep set-like ;
32 : tester ( set -- quot )
33 fast-set [ in? ] curry ; inline
35 : sequence/tester ( set1 set2 -- set1' quot )
36 [ members ] [ tester ] bi* ; inline
41 [ sequence/tester filter ] keep set-like ;
44 [ sequence/tester [ not ] compose filter ] keep set-like ;
47 sequence/tester any? ;
50 sequence/tester all? ;
53 2dup subset? [ swap subset? ] [ 2drop f ] if ;
57 M: set duplicates drop f ;
59 M: set all-unique? drop t ;
63 : (pruned) ( elt hash vec -- )
64 3dup drop in? [ 3drop ] [
65 [ drop adjoin ] [ nip push ] 3bi
68 : pruned ( seq -- newseq )
69 [ f fast-set ] [ length <vector> ] bi
70 [ [ (pruned) ] 2curry each ] keep ;
75 INSTANCE: sequence set
81 [ delete ] [ push ] 2bi ;
87 [ members ] dip like ;
90 [ pruned ] keep like ;
92 M: sequence all-unique?
93 dup pruned sequence= ;
95 : combine ( sets -- set )
98 : gather ( seq quot -- newseq )
99 map concat members ; inline
101 : adjoin-at ( value key assoc -- )
102 [ [ f fast-set ] unless* [ adjoin ] keep ] change-at ;
104 ! Temporarily for compatibility
107 : unique ( seq -- assoc )
108 [ dup ] H{ } map>assoc ;
109 : conjoin ( elt assoc -- )
111 : conjoin-at ( value key assoc -- )
112 [ dupd ?set-at ] change-at ;