diff --git a/builtin/builtin.go b/builtin/builtin.go index dc05570..794fd4b 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -80,3 +80,9 @@ func Must[T any](value T, err error) T { func FirstError(errs ...error) error { return FirstNonEmpty(errs...) } + + +// append to a slice without needing the "assign to same variable" boilerplate +func Append[T any](slice *[]T, item T) { + *slice = append(*slice, item) +} diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 3e03e86..0431d5c 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -3,6 +3,7 @@ package builtin import ( "context" "errors" + "strings" "testing" "github.com/function61/gokit/testing/assert" @@ -76,3 +77,12 @@ func TestFirstNonEmptyWithError(t *testing.T) { assert.EqualString(t, FirstNonEmpty(nilError, actualError).Error(), "actual") assert.Assert(t, FirstNonEmpty(nilError, nilError) == nil) } + +func TestAppend(t *testing.T) { + favoriteThings := []string{"hamburger"} + + Append(&favoriteThings, "food") + Append(&favoriteThings, "bar") + + assert.EqualString(t, strings.Join(favoriteThings, ", "), "hamburger, food, bar") +}