From 8e1383ea6a9561610e00b8c7f401bca1257f9001 Mon Sep 17 00:00:00 2001 From: Oskar Haarklou Veileborg Date: Mon, 9 Jan 2023 20:28:08 +0100 Subject: Ensure immutability of sets (and maps with SetMany) --- sets.go | 32 ++++++++++---------------------- 1 file changed, 10 insertions(+), 22 deletions(-) (limited to 'sets.go') diff --git a/sets.go b/sets.go index fc30ffb..28f888d 100644 --- a/sets.go +++ b/sets.go @@ -18,7 +18,7 @@ func NewSet[T comparable](hasher Hasher[T], values ...T) Set[T] { m: NewMap[T, struct{}](hasher), } for _, value := range values { - s.m.set(value, struct{}{}, true) + s.m = s.m.set(value, struct{}{}, true) } return s } @@ -27,24 +27,18 @@ func NewSet[T comparable](hasher Hasher[T], values ...T) Set[T] { // // This function will return a new set even if the set already contains the value. func (s Set[T]) Set(values ...T) Set[T] { - n := Set[T]{ - m: s.m.clone(), - } for _, value := range values { - n.m.set(value, struct{}{}, true) + s.m = s.m.Set(value, struct{}{}) } - return n + return s } // Delete returns a set with the given key removed. func (s Set[T]) Delete(values ...T) Set[T] { - n := Set[T]{ - m: s.m.clone(), - } for _, value := range values { - n.m.delete(value, true) + s.m = s.m.Delete(value) } - return n + return s } // Has returns true when the set contains the given value @@ -137,7 +131,7 @@ func NewSortedSet[T comparable](comparer Comparer[T], values ...T) SortedSet[T] m: NewSortedMap[T, struct{}](comparer), } for _, value := range values { - s.m.set(value, struct{}{}, true) + s.m = s.m.set(value, struct{}{}, true) } return s } @@ -146,24 +140,18 @@ func NewSortedSet[T comparable](comparer Comparer[T], values ...T) SortedSet[T] // // This function will return a new set even if the set already contains the value. func (s SortedSet[T]) Set(values ...T) SortedSet[T] { - n := SortedSet[T]{ - m: s.m.clone(), - } for _, value := range values { - n.m.set(value, struct{}{}, true) + s.m = s.m.Set(value, struct{}{}) } - return n + return s } // Delete returns a set with the given key removed. func (s SortedSet[T]) Delete(values ...T) SortedSet[T] { - n := SortedSet[T]{ - m: s.m.clone(), - } for _, value := range values { - n.m.delete(value, true) + s.m = s.m.Delete(value) } - return n + return s } // Has returns true when the set contains the given value -- cgit v1.2.3