option.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. 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, reflect.Func, reflect.Interface:
  18. mH.Hassert(!v.IsNil(), "NewSome[T any](): value==nil")
  19. }
  20. sf := &Option[T]{some: &value}
  21. return sf
  22. }
  23. // NewNone - нет результата в ответе.
  24. func NewNone[T any]() mKs.IOption[T] {
  25. return &Option[T]{
  26. some: nil,
  27. }
  28. }
  29. // IsSome - проверяет, есть ли значение.
  30. func (sf *Option[T]) IsSome() bool {
  31. return sf.some != nil
  32. }
  33. // IsNone - проверяет, есть ли значение.
  34. func (sf *Option[T]) IsNone() bool {
  35. return sf.some == nil
  36. }
  37. // Some - извлекает значение (паника, если None).
  38. func (sf *Option[T]) Some() T {
  39. mH.Hassert(sf.some != nil, "Option[T].Some(): val==nil!")
  40. return *sf.some
  41. }
  42. // SomeOr - возвращает значение или дефолтное.
  43. func (sf Option[T]) SomeOr(defaultValue T) T {
  44. if sf.some == nil {
  45. return defaultValue
  46. }
  47. return *sf.some
  48. }
  49. // SomeOrFn -- возвращает значение, если оно есть, или результат выполнения функции.
  50. func (sf *Option[T]) SomeOrFn(fn func() T) T {
  51. mH.Hassert(fn != nil, "Option[T].SomeOrFn(): fn==nil")
  52. if sf.some == nil {
  53. return fn()
  54. }
  55. return *sf.some
  56. }
  57. // Hassert -- проверяет, что не пустое значение (с паникой).
  58. func (sf *Option[T]) Hassert(msgFormat defs.Str, args ...any) T {
  59. mH.Hassert(sf.some != nil, msgFormat, args...)
  60. return *sf.some
  61. }
  62. // Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
  63. func (sf *Option[T]) Assert(msgFormat defs.Str, args ...any) T {
  64. mH.Assert(sf.some != nil, msgFormat, args...)
  65. return *sf.some
  66. }