option.go 2.1 KB

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