feat!: update contract for 'Table.Get()'
All checks were successful
CI / Check PR Title (pull_request) Successful in 19s
CI / Go Lint (pull_request) Successful in 42s
CI / Markdown Lint (pull_request) Successful in 22s
CI / Makefile Lint (pull_request) Successful in 40s
CI / Unit Tests (pull_request) Successful in 37s
CI / Fuzz Tests (pull_request) Successful in 1m12s
CI / Mutation Tests (pull_request) Successful in 1m18s

This commit is contained in:
2026-04-03 21:27:48 +02:00
parent 322d71f0be
commit 95687acade
4 changed files with 19 additions and 20 deletions

View File

@@ -73,16 +73,16 @@ func FuzzInsertLookup(f *testing.F) {
delete(expected, step.key) delete(expected, step.key)
_, err = actual.Get(step.key) _, ok := actual.Get(step.key)
assert.Error(err) assert.False(ok)
} else { } else {
err := actual.Put(step.key, step.value) err := actual.Put(step.key, step.value)
assert.NoError(err) assert.NoError(err)
expected[step.key] = step.value expected[step.key] = step.value
found, err := actual.Get(step.key) found, ok := actual.Get(step.key)
assert.NoError(err) assert.True(ok)
assert.Equal(step.value, found) assert.Equal(step.value, found)
} }

View File

@@ -108,12 +108,12 @@ func TestGetMany(t *testing.T) {
} }
for i := range 2_000 { for i := range 2_000 {
value, err := table.Get(i) value, ok := table.Get(i)
if i < 1_000 { if i < 1_000 {
assert.NoError(err) assert.True(ok)
assert.Equal(value, true) assert.Equal(value, true)
} else { } else {
assert.Error(err) assert.False(ok)
} }
} }
} }

View File

@@ -14,19 +14,19 @@ func Example_basic() {
fmt.Println("Put error:", err) fmt.Println("Put error:", err)
} }
if item, err := table.Get(1); err != nil { if item, ok := table.Get(1); !ok {
fmt.Println("Error:", err) fmt.Println("Not Found 1!")
} else { } else {
fmt.Println("Found 1:", item) fmt.Println("Found 1:", item)
} }
if item, err := table.Get(0); err != nil { if item, ok := table.Get(0); !ok {
fmt.Println("Error:", err) fmt.Println("Not Found 0!")
} else { } else {
fmt.Println("Found 0:", item) fmt.Println("Found 0:", item)
} }
// Output: // Output:
// Found 1: Hello, World! // Found 1: Hello, World!
// Error: key '0' not found // Not Found 0!
} }

View File

@@ -86,24 +86,23 @@ func (t *Table[K, V]) shrink() error {
return t.resize(t.bucketA.capacity / t.growthFactor) return t.resize(t.bucketA.capacity / t.growthFactor)
} }
// Get fetches the value for a key in the [Table]. Returns an error if no value // Get fetches the value for a key in the [Table].
// is found. func (t Table[K, V]) Get(key K) (value V, ok bool) {
func (t Table[K, V]) Get(key K) (value V, err error) {
if item, ok := t.bucketA.get(key); ok { if item, ok := t.bucketA.get(key); ok {
return item, nil return item, true
} }
if item, ok := t.bucketB.get(key); ok { if item, ok := t.bucketB.get(key); ok {
return item, nil return item, true
} }
return value, fmt.Errorf("key '%v' not found", key) return
} }
// Has returns true if a key has a value in the table. // Has returns true if a key has a value in the table.
func (t Table[K, V]) Has(key K) (exists bool) { func (t Table[K, V]) Has(key K) (exists bool) {
_, err := t.Get(key) _, exists = t.Get(key)
return err == nil return
} }
// Put sets the value for a key. Returns error if its value cannot be set. // Put sets the value for a key. Returns error if its value cannot be set.