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) + } + }) + } +}