option.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package option
  2. import (
  3. "reflect"
  4. mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
  5. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
  6. mH "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
  7. )
  8. // Option -- результат возможно содержащий nil.
  9. type Option[T any] struct {
  10. some *T
  11. }
  12. // NewSome - полезный результат.
  13. func NewSome[T any](value T) mKs.IOption[T] {
  14. // Для некоторых типов нужна дополнительная проверка через reflect
  15. v := reflect.ValueOf(value)
  16. switch v.Kind() {
  17. case reflect.Pointer, reflect.Slice, reflect.Map, reflect.Chan,
  18. reflect.Func, reflect.Interface:
  19. isNil := def_spec.Bool(v.IsNil())
  20. mH.If(isNil).Hassert("NewSome[T any](): value==nil")
  21. }
  22. sf := &Option[T]{some: &value}
  23. return sf
  24. }
  25. // NewNone - нет результата в ответе.
  26. func NewNone[T any]() def_spec.IOption[T] {
  27. return &Option[T]{
  28. some: nil,
  29. }
  30. }
  31. // IsSome - проверяет, есть ли значение.
  32. func (sf *Option[T]) IsSome() bool {
  33. return sf.some != nil
  34. }
  35. // IsNone - проверяет, есть ли значение.
  36. func (sf *Option[T]) IsNone() bool {
  37. return sf.some == nil
  38. }
  39. // Some - извлекает значение (паника, если None).
  40. func (sf *Option[T]) Some() T {
  41. mH.If(sf.some == nil).Hassert("Option[T].Some(): val==nil!")
  42. return *sf.some
  43. }
  44. // SomeOr - возвращает значение или дефолтное.
  45. func (sf Option[T]) SomeOr(defaultValue T) T {
  46. if sf.some == nil {
  47. return defaultValue
  48. }
  49. return *sf.some
  50. }
  51. // SomeOrFn -- возвращает значение, если оно есть, или результат выполнения функции.
  52. func (sf *Option[T]) SomeOrFn(fn func() T) T {
  53. mH.If(fn == nil).Hassert("Option[T].SomeOrFn(): fn==nil")
  54. if sf.some == nil {
  55. return fn()
  56. }
  57. return *sf.some
  58. }
  59. // Hassert -- проверяет, что не пустое значение (с паникой).
  60. func (sf *Option[T]) Hassert(msgFormat def_spec.ATxt, args ...any) T {
  61. mH.If(sf.some == nil).Hassert(msgFormat, args...)
  62. return *sf.some
  63. }
  64. // Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
  65. func (sf *Option[T]) Assert(msgFormat def_spec.ATxt, args ...any) T {
  66. mH.If(sf.some == nil).Assert(msgFormat, args...)
  67. return *sf.some
  68. }