initial version
This commit is contained in:
29
option.go
Normal file
29
option.go
Normal 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
88
option_test.go
Normal 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)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user