option.go 2.3 KB

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