feature: added optional
This commit is contained in:
6
pkg/container/optional/optional.go
Normal file
6
pkg/container/optional/optional.go
Normal file
@@ -0,0 +1,6 @@
|
||||
package optional
|
||||
|
||||
type Optional[T any] struct {
|
||||
Present bool
|
||||
Value T
|
||||
}
|
||||
23
pkg/container/optional/optional_factories.go
Normal file
23
pkg/container/optional/optional_factories.go
Normal file
@@ -0,0 +1,23 @@
|
||||
package optional
|
||||
|
||||
func Empty[T any]() *Optional[T] {
|
||||
return &Optional[T]{
|
||||
Present: false,
|
||||
}
|
||||
}
|
||||
|
||||
func OfAny[T any](value T) *Optional[T] {
|
||||
return &Optional[T]{
|
||||
Present: true,
|
||||
Value: value,
|
||||
}
|
||||
}
|
||||
|
||||
func OfNonDefault[T comparable](value T) *Optional[T] {
|
||||
var defaultValue T
|
||||
if value != defaultValue {
|
||||
return Empty[T]()
|
||||
} else {
|
||||
return OfAny[T](value)
|
||||
}
|
||||
}
|
||||
59
pkg/container/optional/optional_methods.go
Normal file
59
pkg/container/optional/optional_methods.go
Normal file
@@ -0,0 +1,59 @@
|
||||
package optional
|
||||
|
||||
import "log"
|
||||
|
||||
func (self *Optional[T]) IfPresent(action func(T)) {
|
||||
if self.Present {
|
||||
action(self.Value)
|
||||
}
|
||||
}
|
||||
|
||||
func (self *Optional[T]) OrElsePanic(err error) T {
|
||||
return self.OrElsePanicF(func() error {
|
||||
return err
|
||||
})
|
||||
}
|
||||
|
||||
func (self *Optional[T]) OrElsePanicF(errorSupplier func() error) T {
|
||||
if self.Present {
|
||||
return self.Value
|
||||
}
|
||||
|
||||
err := errorSupplier()
|
||||
panic(err)
|
||||
}
|
||||
|
||||
func (self *Optional[T]) OrElseFatal(err error) T {
|
||||
return self.OrElseFatalF(func() error {
|
||||
return err
|
||||
})
|
||||
}
|
||||
|
||||
func (self *Optional[T]) OrElseFatalF(errorSupplier func() error) T {
|
||||
if self.Present {
|
||||
return self.Value
|
||||
}
|
||||
|
||||
err := errorSupplier()
|
||||
var returnStub T
|
||||
log.Fatal(err)
|
||||
|
||||
// Компилятор без return не пропустит, но сюда никогда не дойдет из-за фатала выше.
|
||||
return returnStub
|
||||
}
|
||||
|
||||
func (self *Optional[T]) OrElse(defaultValue T) T {
|
||||
if self.Present {
|
||||
return self.Value
|
||||
}
|
||||
|
||||
return defaultValue
|
||||
}
|
||||
|
||||
func (self *Optional[T]) OrElseGet(defaultValueSupplier func() T) T {
|
||||
if self.Present {
|
||||
return self.Value
|
||||
}
|
||||
|
||||
return defaultValueSupplier()
|
||||
}
|
||||
Reference in New Issue
Block a user