diff --git a/datastructure/set/set.go b/datastructure/set/set.go index 4b351e7..17f37bd 100644 --- a/datastructure/set/set.go +++ b/datastructure/set/set.go @@ -17,6 +17,19 @@ func (s Set[T]) Add(values ...T) { } } +// AddIfNotExist checks if item exists in the set, +// it adds the item to set and returns true if it does not exist in the set, +// or else it does nothing and returns false. +func (s Set[T]) AddIfNotExist(value T) bool { + if !s.Contain(value) { + if _, ok := s[value]; !ok { + s[value] = struct{}{} + return true + } + } + return false +} + // Contain checks if set contains value or not func (s Set[T]) Contain(value T) bool { _, ok := s[value] diff --git a/datastructure/set/set_test.go b/datastructure/set/set_test.go index be11e68..b8067fc 100644 --- a/datastructure/set/set_test.go +++ b/datastructure/set/set_test.go @@ -17,6 +17,17 @@ func TestSet_Add(t *testing.T) { assert.Equal(true, set.Equal(expected)) } +func TestSet_AddIfNotExist(t *testing.T) { + assert := internal.NewAssert(t, "TestSet_AddIfNotExist") + + set := NewSet[int]() + set.Add(1, 2, 3) + + assert.Equal(false, set.AddIfNotExist(1)) + assert.Equal(true, set.AddIfNotExist(4)) + assert.Equal(NewSet(1, 2, 3, 4), set) +} + func TestSet_Contain(t *testing.T) { assert := internal.NewAssert(t, "TestSet_Contain")