monads

Monads, For Golang, Using Generics
git clone git://git.lair.cx/monads
Log | Files | Refs | README | LICENSE

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 }