package lo // ToPtr returns a pointer copy of value. func ToPtr[T any](x T) *T { return &x } // FromPtr returns the pointer value or empty. func FromPtr[T any](x *T) T { if x == nil { return Empty[T]() } return *x } // FromPtrOr returns the pointer value or the fallback value. func FromPtrOr[T any](x *T, fallback T) T { if x == nil { return fallback } return *x } // ToSlicePtr returns a slice of pointer copy of value. func ToSlicePtr[T any](collection []T) []*T { return Map(collection, func(x T, _ int) *T { return &x }) } // ToAnySlice returns a slice with all elements mapped to `any` type func ToAnySlice[T any](collection []T) []any { result := make([]any, len(collection)) for i, item := range collection { result[i] = item } return result } // FromAnySlice returns an `any` slice with all elements mapped to a type. // Returns false in case of type conversion failure. func FromAnySlice[T any](in []any) (out []T, ok bool) { defer func() { if r := recover(); r != nil { out = []T{} ok = false } }() result := make([]T, len(in)) for i, item := range in { result[i] = item.(T) } return result, true } // Empty returns an empty value. func Empty[T any]() T { var zero T return zero } // IsEmpty returns true if argument is a zero value. func IsEmpty[T comparable](v T) bool { var zero T return zero == v } // IsNotEmpty returns true if argument is not a zero value. func IsNotEmpty[T comparable](v T) bool { var zero T return zero != v } // Coalesce returns the first non-empty arguments. Arguments must be comparable. func Coalesce[T comparable](v ...T) (result T, ok bool) { for _, e := range v { if e != result { result = e ok = true return } } return }