| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- package option
- import (
- "reflect"
- mH "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
- mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kspec"
- )
- // Option -- результат возможно содержащий nil.
- type Option[T any] struct {
- some *T
- }
- // NewSome - полезный результат.
- func NewSome[T any](value T) mKt.IOption[T] {
- // Для некоторых типов нужна дополнительная проверка через reflect
- v := reflect.ValueOf(value)
- switch v.Kind() {
- case reflect.Ptr, reflect.Slice, reflect.Map, reflect.Chan, reflect.Func, reflect.Interface:
- mH.Hassert(!v.IsNil(), "NewSome[T any](): value==nil")
- }
- sf := &Option[T]{some: &value}
- return sf
- }
- // NewNone - нет результата в ответе.
- func NewNone[T any]() mKt.IOption[T] {
- return &Option[T]{
- some: nil,
- }
- }
- // IsSome - проверяет, есть ли значение.
- func (sf *Option[T]) IsSome() bool {
- return sf.some != nil
- }
- // IsNone - проверяет, есть ли значение.
- func (sf *Option[T]) IsNone() bool {
- return sf.some == nil
- }
- // Some - извлекает значение (паника, если None).
- func (sf *Option[T]) Some() T {
- mH.Hassert(sf.some != nil, "Option[T].Some(): val==nil!")
- return *sf.some
- }
- // SomeOr - возвращает значение или дефолтное.
- func (sf Option[T]) SomeOr(defaultValue T) T {
- if sf.some == nil {
- return defaultValue
- }
- return *sf.some
- }
- // SomeOrFn -- возвращает значение, если оно есть, или результат выполнения функции.
- func (sf *Option[T]) SomeOrFn(fn func() T) T {
- mH.Hassert(fn != nil, "Option[T].SomeOrFn(): fn==nil")
- if sf.some == nil {
- return fn()
- }
- return *sf.some
- }
- // Hassert -- проверяет, что не пустое значение (с паникой).
- func (sf *Option[T]) Hassert(msgFormat string, args ...any) T {
- mH.Hassert(sf.some != nil, msgFormat, args...)
- return *sf.some
- }
- // Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
- func (sf *Option[T]) Assert(msgFormat string, args ...any) T {
- mH.Assert(sf.some != nil, msgFormat, args...)
- return *sf.some
- }
|