package option import ( "reflect" mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec" mH "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers" ) // Option -- результат возможно содержащий nil. type Option[T any] struct { some *T } // NewSome - полезный результат. func NewSome[T any](value T) mKs.IOption[T] { // Для некоторых типов нужна дополнительная проверка через reflect v := reflect.ValueOf(value) switch v.Kind() { case reflect.Pointer, reflect.Slice, reflect.Map, reflect.Chan, reflect.Func, reflect.Interface: isNil := def_spec.Bool(v.IsNil()) mH.If(isNil).Hassert("NewSome[T any](): value==nil") } sf := &Option[T]{some: &value} return sf } // NewNone - нет результата в ответе. func NewNone[T any]() def_spec.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.If(sf.some == nil).Hassert("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.If(fn == nil).Hassert("Option[T].SomeOrFn(): fn==nil") if sf.some == nil { return fn() } return *sf.some } // Hassert -- проверяет, что не пустое значение (с паникой). func (sf *Option[T]) Hassert(msgFormat def_spec.ATxt, args ...any) T { mH.If(sf.some == nil).Hassert(msgFormat, args...) return *sf.some } // Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде). func (sf *Option[T]) Assert(msgFormat def_spec.ATxt, args ...any) T { mH.If(sf.some == nil).Assert(msgFormat, args...) return *sf.some }