diff options
Diffstat (limited to 'common/orelse.go')
-rw-r--r-- | common/orelse.go | 49 |
1 files changed, 45 insertions, 4 deletions
diff --git a/common/orelse.go b/common/orelse.go index a96bde7..29e3dc7 100644 --- a/common/orelse.go +++ b/common/orelse.go @@ -1,20 +1,61 @@ package common -type Opt[T any] struct { +import "reflect" + +type Opt[T any] interface { + OrElse(thing T) T +} + +type OptError[T any] struct { thing T err error } -func Optional[T any](thing T, err error) Opt[T] { - return Opt[T]{ +type OptNull[T any] struct { + ptr *T +} + +type OptZero[T any] struct { + thing T +} + +func (o OptNull[T]) OrElse(thing T) T { + if o.ptr != nil { + return *o.ptr + } + return thing +} + +func Errorable[T any](thing T, err error) Opt[T] { + return OptError[T]{ thing: thing, err: err, } } -func (o Opt[T]) OrElse(thing T) T { +func (o OptError[T]) OrElse(thing T) T { if o.err != nil { return thing } return o.thing } + +func Nullable[T any](ptr *T) Opt[T] { + return OptNull[T]{ + ptr: ptr, + } +} + +func Zeroable[T any](thing T) Opt[T] { + return OptZero[T]{ + thing: thing, + } +} + +func (o OptZero[T]) OrElse(thing T) T { + var zero T + if reflect.DeepEqual(zero, o.thing) { + return thing + } + return o.thing +} |