From eba10f7f424aad961bbdf7f3e7dc5ea6812045de Mon Sep 17 00:00:00 2001 From: Dmitry Fedotov Date: Fri, 27 Feb 2026 22:17:21 +0300 Subject: [PATCH] initial version --- go.mod | 3 ++ option.go | 29 +++++++++++++++++ option_test.go | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 go.mod create mode 100644 option.go create mode 100644 option_test.go diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..e123454 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module code.uint32.ru/tiny/option + +go 1.24 diff --git a/option.go b/option.go new file mode 100644 index 0000000..916ee02 --- /dev/null +++ b/option.go @@ -0,0 +1,29 @@ +package option + +type Option[T any] struct { + v T + valid bool +} + +func Some[T any](v T) Option[T] { + return Option[T]{ + v: v, + valid: true, + } +} + +func None[T any]() Option[T] { + return Option[T]{} +} + +func (o Option[T]) IsSome() bool { + return o.valid +} + +func (o Option[T]) IsNone() bool { + return !o.valid +} + +func (o Option[T]) Take() T { + return o.v +} diff --git a/option_test.go b/option_test.go new file mode 100644 index 0000000..e76979b --- /dev/null +++ b/option_test.go @@ -0,0 +1,88 @@ +package option_test + +import ( + "testing" + + "code.uint32.ru/tiny/option" +) + +func TestIsSome(t *testing.T) { + tc := []struct { + name string + opt option.Option[int] + want bool + }{ + { + name: "Some", + opt: option.Some(5), + want: true, + }, + { + name: "None", + opt: option.None[int](), + want: false, + }, + } + + for _, c := range tc { + t.Run(c.name, func(t *testing.T) { + if got := c.opt.IsSome(); got != c.want { + t.Errorf("IsSome() = %v; want %v", got, c.want) + } + }) + } +} + +func TestIsNone(t *testing.T) { + tc := []struct { + name string + opt option.Option[int] + want bool + }{ + { + name: "Some", + opt: option.Some(5), + want: false, + }, + { + name: "None", + opt: option.None[int](), + want: true, + }, + } + + for _, c := range tc { + t.Run(c.name, func(t *testing.T) { + if got := c.opt.IsNone(); got != c.want { + t.Errorf("IsNone() = %v; want %v", got, c.want) + } + }) + } +} + +func TestTake(t *testing.T) { + tc := []struct { + name string + opt option.Option[int] + want int + }{ + { + name: "Some", + opt: option.Some(5), + want: 5, + }, + { + name: "None", + opt: option.None[int](), + want: 0, + }, + } + + for _, c := range tc { + t.Run(c.name, func(t *testing.T) { + if got := c.opt.Take(); got != c.want { + t.Errorf("Take() = %v; want %v", got, c.want) + } + }) + } +}