option.go 2.2 KB

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