option.go 2.1 KB

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