collections/optional.go

49 lines
1.2 KiB
Go

package collections
import "pkg.icikowski.pl/collections/functions"
// Optional represents an optional value of type T.
type Optional[T any] struct {
e T
present bool
}
// IsPresent determines whether the underlying value is present.
func (o *Optional[T]) IsPresent() bool {
return o.present
}
// Get returns the underlying value.
func (o *Optional[T]) Get() T {
return o.e
}
// OrElse returns the underlying value or given value if underlying value is not present.
func (o *Optional[T]) OrElse(e T) T {
if !o.present {
return e
}
return o.e
}
// OrElseGet returns the underlying value or value from given supplier if underlying value is not present.
func (o *Optional[T]) OrElseGet(s functions.Supplier[T]) T {
if !o.present {
return s()
}
return o.e
}
// Transform transforms the underlying value with given [functions.UnaryOperator] if the vale is present.
func (o *Optional[T]) Transform(u functions.UnaryOperator[T]) *Optional[T] {
if o.present {
o.e = u(o.e)
}
return o
}
// MapOptional maps optional of type T to optional of type U using given [functions.Function].
func MapOptional[T, U any](src *Optional[T], mapper functions.Function[T, U]) *Optional[U] {
return &Optional[U]{mapper(src.e), src.present}
}