From 7239eca2e5c38137545980dd4a81921c9ba6ff47 Mon Sep 17 00:00:00 2001 From: Zachary King Date: Fri, 6 Jun 2025 09:59:12 -0400 Subject: [PATCH] initial option and result --- go.mod | 3 +++ option.go | 47 +++++++++++++++++++++++++++++++++++++++++++++++ result.go | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 go.mod create mode 100644 option.go create mode 100644 result.go diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..6b86557 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/zchrykng/go-utils + +go 1.22.2 diff --git a/option.go b/option.go new file mode 100644 index 0000000..a589fd4 --- /dev/null +++ b/option.go @@ -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 +} + diff --git a/result.go b/result.go new file mode 100644 index 0000000..3ef12c7 --- /dev/null +++ b/result.go @@ -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 +} + +