option.go 2.4 KB

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