option.go (656B)
1 package options 2 3 type Option[T any] struct { 4 value T 5 isValid bool 6 } 7 8 func Empty[T any]() Option[T] { 9 return Option[T]{ 10 isValid: false, 11 } 12 } 13 14 func Wrap[T any](value T) Option[T] { 15 return Option[T]{ 16 value: value, 17 isValid: true, 18 } 19 } 20 21 func (v Option[T]) Valid() bool { 22 return v.isValid 23 } 24 25 func (v Option[T]) Unwrap() T { 26 return v.value 27 } 28 29 func Map[T, R any](value Option[T], action func(T) R) Option[R] { 30 if !value.isValid { 31 return Empty[R]() 32 } 33 34 return Wrap[R](action(value.value)) 35 } 36 37 func FlatMap[T, R any](value Option[T], action func(T) Option[R]) Option[R] { 38 if !value.isValid { 39 return Empty[R]() 40 } 41 42 return action(value.value) 43 }