initial option and result
This commit is contained in:
47
option.go
Normal file
47
option.go
Normal file
@@ -0,0 +1,47 @@
|
||||
package util
|
||||
|
||||
import "errors"
|
||||
|
||||
type Option[T any] struct {
|
||||
value *T
|
||||
}
|
||||
|
||||
var ErrOptionIsNone = errors.New("gonads: Option[T] has no value")
|
||||
|
||||
func NewOption[T any]() *Option[T] {
|
||||
return &Option[T]{}
|
||||
}
|
||||
|
||||
func (o Option[T]) IsSome() bool {
|
||||
return o.value != nil
|
||||
}
|
||||
|
||||
func (o Option[T]) IsNone() bool {
|
||||
return !o.IsSome()
|
||||
}
|
||||
|
||||
func (o Option[T]) Take() (T, error) {
|
||||
if o.IsNone() {
|
||||
var zero T
|
||||
return zero, ErrOptionIsNone
|
||||
}
|
||||
|
||||
return *o.value, nil
|
||||
}
|
||||
|
||||
func (o *Option[T]) Set(val T) {
|
||||
o.value = &val
|
||||
}
|
||||
|
||||
func (o *Option[T]) Clear() {
|
||||
o.value = nil
|
||||
}
|
||||
|
||||
func (o Option[T]) Yank() T {
|
||||
if o.IsNone() {
|
||||
panic("Yank on None Option")
|
||||
}
|
||||
|
||||
return *o.value
|
||||
}
|
||||
|
||||
40
result.go
Normal file
40
result.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package util
|
||||
|
||||
type Result[T any] struct {
|
||||
value *T
|
||||
err error
|
||||
}
|
||||
|
||||
func ResultOk[T any](value T) Result[T] {
|
||||
return Result[T]{value: &value, err: nil}
|
||||
}
|
||||
|
||||
func ResultErr[T any](err error) Result[T] {
|
||||
return Result[T]{value: nil, err: err}
|
||||
}
|
||||
|
||||
func (res Result[T]) IsOk() bool {
|
||||
return res.err == nil
|
||||
}
|
||||
|
||||
func (res Result[T]) IsErr() bool {
|
||||
return !res.IsOk()
|
||||
}
|
||||
|
||||
func (res Result[T]) Value() T {
|
||||
if !res.IsOk() {
|
||||
panic("Yank on Err Result")
|
||||
}
|
||||
|
||||
return *res.value
|
||||
}
|
||||
|
||||
func (res Result[T]) Error() error {
|
||||
if !res.IsErr() {
|
||||
panic("Yank on OK Result")
|
||||
}
|
||||
|
||||
return res.err
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user