diff --git a/README.md b/README.md index 3751b339..90bdd506 100644 --- a/README.md +++ b/README.md @@ -256,6 +256,7 @@ Type manipulation helpers: - [ToSlicePtr](#tosliceptr) - [FromSlicePtr](#fromsliceptr) - [FromSlicePtrOr](#fromsliceptror) +- [FromSlicePtrNotNil](#fromsliceptrnotnil) - [ToAnySlice](#toanyslice) - [FromAnySlice](#fromanyslice) - [Empty](#empty) @@ -2709,10 +2710,22 @@ Returns a slice with the pointer values or the fallback value. str1 := "hello" str2 := "world" -ptr := lo.FromSlicePtrOr[string]([]*string{&str1, &str2, "fallback value"}) +ptr := lo.FromSlicePtrOr[string]([]*string{&str1, &str2, nil}, "fallback value") // []string{"hello", "world", "fallback value"} ``` +### FromSlicePtrNotNil + +Returns a slice with the pointer values without nil elements. + +```go +str1 := "hello" +str2 := "world" + +ptr := lo.FromSlicePtrNotNil[string]([]*string{&str1, &str2, nil}) +// []string{"hello", "world"} +``` + ### ToAnySlice Returns a slice with all elements mapped to `any` type. diff --git a/type_manipulation.go b/type_manipulation.go index ef070281..d47f4714 100644 --- a/type_manipulation.go +++ b/type_manipulation.go @@ -69,7 +69,7 @@ func FromSlicePtr[T any](collection []*T) []T { }) } -// FromSlicePtr returns a slice with the pointer values or the fallback value. +// FromSlicePtrOr returns a slice with the pointer values or the fallback value. func FromSlicePtrOr[T any](collection []*T, fallback T) []T { return Map(collection, func(x *T, _ int) T { if x == nil { @@ -79,6 +79,16 @@ func FromSlicePtrOr[T any](collection []*T, fallback T) []T { }) } +// FromSlicePtrNotNil returns a slice with the pointer values without nil elements. +func FromSlicePtrNotNil[T any](collection []*T) []T { + return FilterMap(collection, func(x *T, _ int) (T, bool) { + if x == nil { + return Empty[T](), false + } + return *x, true + }) +} + // ToAnySlice returns a slice with all elements mapped to `any` type func ToAnySlice[T any](collection []T) []any { result := make([]any, len(collection)) diff --git a/type_manipulation_test.go b/type_manipulation_test.go index 3a7d3145..523f07ed 100644 --- a/type_manipulation_test.go +++ b/type_manipulation_test.go @@ -141,6 +141,16 @@ func TestFromSlicePtrOr(t *testing.T) { is.Equal(result1, []string{str1, str2, "fallback"}) } +func TestFromSlicePtrNotNil(t *testing.T) { + is := assert.New(t) + + str1 := "foo" + str2 := "bar" + result1 := FromSlicePtrNotNil([]*string{&str1, &str2, nil}) + + is.Equal(result1, []string{str1, str2}) +} + func TestToAnySlice(t *testing.T) { t.Parallel() is := assert.New(t)