diff options
-rw-r--r-- | src/gobang.go | 23 | ||||
-rw-r--r-- | tests/gobang.go | 39 |
2 files changed, 62 insertions, 0 deletions
diff --git a/src/gobang.go b/src/gobang.go index 38ae50a..a75688d 100644 --- a/src/gobang.go +++ b/src/gobang.go @@ -32,6 +32,10 @@ const ( ) +type SetT[T comparable] struct{ + data map[T]struct{} +} + type PairT[A any, B any] struct{ L A R B @@ -54,6 +58,7 @@ const ( SQLiteNow = "strftime('%Y-%m-%dT%H:%M:%f000000Z', 'now')" ) + var ( level LogLevel = LevelInfo emitMetric = true @@ -70,6 +75,24 @@ var ( +func SetOf[T comparable](values ...T) SetT[T] { + s := SetT[T]{ + data: map[T]struct{}{ + }, + } + + for _, value := range values { + s.data[value] = struct{}{} + } + + return s +} + +func Contains[T comparable](set SetT[T], value T) bool { + _, ok := set.data[value] + return ok +} + func MapIndexed[A any, B any](fn func(A, int) B, coll []A) []B { out := make([]B, len(coll)) for i, x := range coll { diff --git a/tests/gobang.go b/tests/gobang.go index 56e3978..e6c4ef2 100644 --- a/tests/gobang.go +++ b/tests/gobang.go @@ -15,6 +15,43 @@ import ( +func test_SetOf() { + TestStart("SetOf()") + + Testing("empty set", func() { + expected := SetT[int]{ + data: map[int]struct{}{ + }, + } + + TAssertEqual(SetOf[int](), expected) + }) + + Testing("equal sets", func() { + expected := SetT[int]{ + data: map[int]struct{}{ + 1: struct{}{}, + 2: struct{}{}, + 3: struct{}{}, + }, + } + + TAssertEqual(SetOf(1, 2, 3), expected) + }) +} + +func test_Contains() { + TestStart("Contains()") + + Testing("trivial example usage", func() { + s := SetOf(1, 2, 3, 4, 5) + TAssertEqual(Contains(s, 0), false) + TAssertEqual(Contains(s, 1), true) + TAssertEqual(Contains(s, 5), true) + TAssertEqual(Contains(s, 6), false) + }) +} + func test_MapIndexed() { TestStart("MapIndexed()") @@ -1444,6 +1481,8 @@ func test_setHostname() { func MainTest() { Init() + test_SetOf() + test_Contains() test_MapIndexed() test_Map() test_Filter() |