Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions set/set.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,17 @@ import (

type Set[T comparable] map[T]struct{}

func NewSet[T comparable](vals ...T) Set[T] {
func New[T comparable](vals ...T) Set[T] {
s := Set[T]{}
for _, v := range vals {
s[v] = struct{}{}
}
return s
}

func MergeSet[T comparable](old, new Set[T]) Set[T] {
// Merge merges two sets, giving priority to the old set in case of conflicts.
// It will create a new set and leave the input sets unmodified.
func Merge[T comparable](old, new Set[T]) Set[T] {
if new == nil {
return old
}
Expand Down Expand Up @@ -60,6 +62,7 @@ func (s Set[T]) Contains(value T) bool {
return ok
}

// Merge adds all elements from the other set into the current set.
func (s Set[T]) Merge(other Set[T]) {
for v := range other {
s.Add(v)
Expand Down
26 changes: 13 additions & 13 deletions set/set_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ import (
"testing"
)

func TestNewSet(t *testing.T) {
set := NewSet(1, 2, 3)
func TestNew(t *testing.T) {
set := New(1, 2, 3)
if len(set) != 3 {
t.Errorf("Expected set length 3, got %d", len(set))
}
Expand All @@ -29,33 +29,33 @@ func TestNewSet(t *testing.T) {
}
}

func TestMergeSet(t *testing.T) {
set1 := NewSet(1, 2)
set2 := NewSet(3, 4)
merged := MergeSet(set1, set2)
func TestMerge(t *testing.T) {
set1 := New(1, 2)
set2 := New(3, 4)
merged := Merge(set1, set2)
if len(merged) != 4 {
t.Errorf("Expected merged set length 4, got %d", len(merged))
}
}

func TestSetAdd(t *testing.T) {
set := NewSet(1, 2)
set := New(1, 2)
set.Add(3)
if !set.Contains(3) {
t.Errorf("Set does not contain added element")
}
}

func TestSetRemove(t *testing.T) {
set := NewSet(1, 2, 3)
set := New(1, 2, 3)
set.Remove(2)
if set.Contains(2) {
t.Errorf("Set still contains removed element")
}
}

func TestSetContains(t *testing.T) {
set := NewSet(1, 2, 3)
set := New(1, 2, 3)
if !set.Contains(2) {
t.Errorf("Set does not contain expected element")
}
Expand All @@ -65,16 +65,16 @@ func TestSetContains(t *testing.T) {
}

func TestSetMerge(t *testing.T) {
set1 := NewSet(1, 2)
set2 := NewSet(3, 4)
set1 := New(1, 2)
set2 := New(3, 4)
set1.Merge(set2)
if len(set1) != 4 {
t.Errorf("Expected merged set length 4, got %d", len(set1))
}
}

func TestSetTransformAsSlice(t *testing.T) {
set := NewSet(3, 1, 2)
set := New(3, 1, 2)
slice := set.TransformAsSlice()
if len(slice) != 3 {
t.Errorf("Expected slice length 3, got %d", len(slice))
Expand All @@ -85,7 +85,7 @@ func TestSetTransformAsSlice(t *testing.T) {
}

func TestSetMarshalJSON(t *testing.T) {
set := NewSet(1, 2, 3)
set := New(1, 2, 3)
data, err := json.Marshal(set)
if err != nil {
t.Errorf("Failed to marshal JSON: %v", err)
Expand Down