summaryrefslogtreecommitdiff
path: root/go/custom-set/custom_set.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/custom-set/custom_set.go')
-rw-r--r--go/custom-set/custom_set.go132
1 files changed, 132 insertions, 0 deletions
diff --git a/go/custom-set/custom_set.go b/go/custom-set/custom_set.go
new file mode 100644
index 0000000..1994dc5
--- /dev/null
+++ b/go/custom-set/custom_set.go
@@ -0,0 +1,132 @@
+package stringset
+
+import "strings"
+
+const testVersion = 3
+
+type Set map[string]struct{}
+
+func New() Set {
+ return make(Set)
+}
+
+func NewFromSlice(s []string) Set {
+ set := make(Set)
+ for _, v := range s {
+ set[v] = struct{}{}
+ }
+ return set
+}
+
+func (set Set) Add(s string) {
+ set[s] = struct{}{}
+}
+
+func (set Set) Delete(s string) {
+ delete(set, s)
+}
+
+func (set Set) Has(s string) bool {
+ _, ok := set[s]
+ return ok
+}
+
+func (set Set) IsEmpty() bool {
+ return len(set) == 0
+}
+
+func (set Set) Len() int {
+ return len(set)
+}
+
+func (set Set) Slice() []string {
+ tmp := make([]string, 0, len(set))
+ for v := range set {
+ tmp = append(tmp, v)
+ }
+ return tmp
+}
+
+func (set Set) String() string {
+ tmp := make([]string, 0, len(set))
+ for v := range set {
+ tmp = append(tmp, `"`+v+`"`)
+ }
+ return `{` + strings.Join(tmp, `, `) + `}`
+}
+
+func Equal(s1, s2 Set) bool {
+ if len(s1) != len(s2) {
+ return false
+ }
+ for v := range s1 {
+ if _, ok := s2[v]; !ok {
+ return false
+ }
+ }
+ return true
+}
+
+func Subset(s1, s2 Set) bool {
+ for v := range s1 {
+ if _, ok := s2[v]; !ok {
+ return false
+ }
+ }
+ return true
+}
+
+func Disjoint(s1, s2 Set) bool {
+ for v := range s1 {
+ if _, ok := s2[v]; ok {
+ return false
+ }
+ }
+ return true
+}
+
+func Intersection(s1, s2 Set) Set {
+ set := make(Set)
+ for v := range s1 {
+ if _, ok := s2[v]; ok {
+ set[v] = struct{}{}
+ }
+ }
+ return set
+}
+
+func Union(s1, s2 Set) Set {
+ set := make(Set)
+ for v := range s1 {
+ set[v] = struct{}{}
+ }
+ for v := range s2 {
+ set[v] = struct{}{}
+ }
+ return set
+}
+
+func Difference(s1, s2 Set) Set {
+ set := make(Set)
+ for v := range s1 {
+ if _, ok := s2[v]; !ok {
+ set[v] = struct{}{}
+ }
+ }
+ return set
+}
+
+func SymmetricDifference(s1, s2 Set) Set {
+ set := make(Set)
+ for v := range s1 {
+ if _, ok := s2[v]; !ok {
+ set[v] = struct{}{}
+ }
+ }
+ for v := range s2 {
+ if _, ok := s1[v]; !ok {
+ set[v] = struct{}{}
+ }
+ }
+ return set
+}