4
4
package set
5
5
6
6
// New gives new set.
7
- func New (items ... any ) Set {
8
- st := set {
9
- elements : make (map [any ]bool ),
7
+ func New [ T comparable ] (items ... T ) Set [ T ] {
8
+ st := set [ T ] {
9
+ elements : make (map [T ]bool ),
10
10
}
11
11
for _ , item := range items {
12
12
st .Add (item )
@@ -15,73 +15,73 @@ func New(items ...any) Set {
15
15
}
16
16
17
17
// Set is an interface of possible methods on 'set'.
18
- type Set interface {
18
+ type Set [ T comparable ] interface {
19
19
// Add: adds new element to the set
20
- Add (item any )
20
+ Add (item T )
21
21
// Delete: deletes the passed element from the set if present
22
- Delete (item any )
22
+ Delete (item T )
23
23
// Len: gives the length of the set (total no. of elements in set)
24
24
Len () int
25
- // GetItems: gives the array( []any ) of elements of the set.
26
- GetItems () []any
25
+ // GetItems: gives the array( []T ) of elements of the set.
26
+ GetItems () []T
27
27
// In: checks whether item is present in set or not.
28
- In (item any ) bool
28
+ In (item T ) bool
29
29
// IsSubsetOf: checks whether set is subset of set2 or not.
30
- IsSubsetOf (set2 Set ) bool
30
+ IsSubsetOf (set2 Set [ T ] ) bool
31
31
// IsProperSubsetOf: checks whether set is proper subset of set2 or not.
32
32
// ex: [1,2,3] proper subset of [1,2,3,4] -> true
33
- IsProperSubsetOf (set2 Set ) bool
33
+ IsProperSubsetOf (set2 Set [ T ] ) bool
34
34
// IsSupersetOf: checks whether set is superset of set2 or not.
35
- IsSupersetOf (set2 Set ) bool
35
+ IsSupersetOf (set2 Set [ T ] ) bool
36
36
// IsProperSupersetOf: checks whether set is proper superset of set2 or not.
37
37
// ex: [1,2,3,4] proper superset of [1,2,3] -> true
38
- IsProperSupersetOf (set2 Set ) bool
38
+ IsProperSupersetOf (set2 Set [ T ] ) bool
39
39
// Union: gives new union set of both sets.
40
40
// ex: [1,2,3] union [3,4,5] -> [1,2,3,4,5]
41
- Union (set2 Set ) Set
41
+ Union (set2 Set [ T ] ) Set [ T ]
42
42
// Intersection: gives new intersection set of both sets.
43
43
// ex: [1,2,3] Intersection [3,4,5] -> [3]
44
- Intersection (set2 Set ) Set
44
+ Intersection (set2 Set [ T ] ) Set [ T ]
45
45
// Difference: gives new difference set of both sets.
46
46
// ex: [1,2,3] Difference [3,4,5] -> [1,2]
47
- Difference (set2 Set ) Set
47
+ Difference (set2 Set [ T ] ) Set [ T ]
48
48
// SymmetricDifference: gives new symmetric difference set of both sets.
49
49
// ex: [1,2,3] SymmetricDifference [3,4,5] -> [1,2,4,5]
50
- SymmetricDifference (set2 Set ) Set
50
+ SymmetricDifference (set2 Set [ T ] ) Set [ T ]
51
51
}
52
52
53
- type set struct {
54
- elements map [any ]bool
53
+ type set [ T comparable ] struct {
54
+ elements map [T ]bool
55
55
}
56
56
57
- func (st * set ) Add (value any ) {
57
+ func (st * set [ T ] ) Add (value T ) {
58
58
st .elements [value ] = true
59
59
}
60
60
61
- func (st * set ) Delete (value any ) {
61
+ func (st * set [ T ] ) Delete (value T ) {
62
62
delete (st .elements , value )
63
63
}
64
64
65
- func (st * set ) GetItems () []any {
66
- keys := make ([]any , 0 , len (st .elements ))
65
+ func (st * set [ T ] ) GetItems () []T {
66
+ keys := make ([]T , 0 , len (st .elements ))
67
67
for k := range st .elements {
68
68
keys = append (keys , k )
69
69
}
70
70
return keys
71
71
}
72
72
73
- func (st * set ) Len () int {
73
+ func (st * set [ T ] ) Len () int {
74
74
return len (st .elements )
75
75
}
76
76
77
- func (st * set ) In (value any ) bool {
77
+ func (st * set [ T ] ) In (value T ) bool {
78
78
if _ , in := st .elements [value ]; in {
79
79
return true
80
80
}
81
81
return false
82
82
}
83
83
84
- func (st * set ) IsSubsetOf (superSet Set ) bool {
84
+ func (st * set [ T ] ) IsSubsetOf (superSet Set [ T ] ) bool {
85
85
if st .Len () > superSet .Len () {
86
86
return false
87
87
}
@@ -94,26 +94,26 @@ func (st *set) IsSubsetOf(superSet Set) bool {
94
94
return true
95
95
}
96
96
97
- func (st * set ) IsProperSubsetOf (superSet Set ) bool {
97
+ func (st * set [ T ] ) IsProperSubsetOf (superSet Set [ T ] ) bool {
98
98
if st .Len () == superSet .Len () {
99
99
return false
100
100
}
101
101
return st .IsSubsetOf (superSet )
102
102
}
103
103
104
- func (st * set ) IsSupersetOf (subSet Set ) bool {
104
+ func (st * set [ T ] ) IsSupersetOf (subSet Set [ T ] ) bool {
105
105
return subSet .IsSubsetOf (st )
106
106
}
107
107
108
- func (st * set ) IsProperSupersetOf (subSet Set ) bool {
108
+ func (st * set [ T ] ) IsProperSupersetOf (subSet Set [ T ] ) bool {
109
109
if st .Len () == subSet .Len () {
110
110
return false
111
111
}
112
112
return st .IsSupersetOf (subSet )
113
113
}
114
114
115
- func (st * set ) Union (st2 Set ) Set {
116
- unionSet := New ()
115
+ func (st * set [ T ] ) Union (st2 Set [ T ] ) Set [ T ] {
116
+ unionSet := New [ T ] ()
117
117
for _ , item := range st .GetItems () {
118
118
unionSet .Add (item )
119
119
}
@@ -123,9 +123,9 @@ func (st *set) Union(st2 Set) Set {
123
123
return unionSet
124
124
}
125
125
126
- func (st * set ) Intersection (st2 Set ) Set {
127
- intersectionSet := New ()
128
- var minSet , maxSet Set
126
+ func (st * set [ T ] ) Intersection (st2 Set [ T ] ) Set [ T ] {
127
+ intersectionSet := New [ T ] ()
128
+ var minSet , maxSet Set [ T ]
129
129
if st .Len () > st2 .Len () {
130
130
minSet = st2
131
131
maxSet = st
@@ -141,8 +141,8 @@ func (st *set) Intersection(st2 Set) Set {
141
141
return intersectionSet
142
142
}
143
143
144
- func (st * set ) Difference (st2 Set ) Set {
145
- differenceSet := New ()
144
+ func (st * set [ T ] ) Difference (st2 Set [ T ] ) Set [ T ] {
145
+ differenceSet := New [ T ] ()
146
146
for _ , item := range st .GetItems () {
147
147
if ! st2 .In (item ) {
148
148
differenceSet .Add (item )
@@ -151,9 +151,9 @@ func (st *set) Difference(st2 Set) Set {
151
151
return differenceSet
152
152
}
153
153
154
- func (st * set ) SymmetricDifference (st2 Set ) Set {
155
- symmetricDifferenceSet := New ()
156
- dropSet := New ()
154
+ func (st * set [ T ] ) SymmetricDifference (st2 Set [ T ] ) Set [ T ] {
155
+ symmetricDifferenceSet := New [ T ] ()
156
+ dropSet := New [ T ] ()
157
157
for _ , item := range st .GetItems () {
158
158
if st2 .In (item ) {
159
159
dropSet .Add (item )
0 commit comments