initial version

This commit is contained in:
2026-02-27 22:17:21 +03:00
parent 31f58f1c66
commit eba10f7f42
3 changed files with 120 additions and 0 deletions

3
go.mod Normal file
View File

@@ -0,0 +1,3 @@
module code.uint32.ru/tiny/option
go 1.24

29
option.go Normal file
View File

@@ -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
}

88
option_test.go Normal file
View File

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