option.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package option
  2. import (
  3. "reflect"
  4. . "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
  5. . "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
  6. )
  7. // Option -- результат возможно содержащий nil.
  8. type Option[T any] struct {
  9. val *T
  10. }
  11. // NewOpt - полезный результат.
  12. func NewOpt[T any](value T) *Option[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. Hassert(!v.IsNil(), "NewSome[T any](): value==nil")
  18. }
  19. sf := &Option[T]{val: &value}
  20. _ = IOption[T](sf)
  21. return sf
  22. }
  23. // NewNone - нет результата в ответе.
  24. func NewNone[T any]() IOption[T] {
  25. return &Option[T]{
  26. val: nil,
  27. }
  28. }
  29. // IsVal - проверяет, есть ли значение.
  30. func (sf *Option[T]) IsVal() bool {
  31. return sf.val != nil
  32. }
  33. // IsSome - проверяет, есть ли значение.
  34. func (sf *Option[T]) IsNone() bool {
  35. return sf.val == nil
  36. }
  37. // Val - извлекает значение (паника, если None).
  38. func (sf *Option[T]) Val() T {
  39. Hassert(sf.val != nil, "Option[T].Val(): val==nil!")
  40. return *sf.val
  41. }
  42. // ValOr - возвращает значение или дефолтное.
  43. func (sf Option[T]) ValOr(defaultValue T) T {
  44. if sf.val == nil {
  45. return defaultValue
  46. }
  47. return *sf.val
  48. }
  49. // ValOrFn -- возвращает значение, если оно есть, или результат выполнения функции.
  50. func (sf *Option[T]) ValOrFn(fn func() T) T {
  51. Hassert(fn != nil, "Result[T].UnwrapOrFn(): fn==nil")
  52. if sf.val == nil {
  53. return fn()
  54. }
  55. return *sf.val
  56. }
  57. // Hassert -- проверяет, что не пустое значение (с паникой).
  58. func (sf *Option[T]) Hassert(msgFormat string, args ...any) T {
  59. Hassert(sf.val != nil, msgFormat, args...)
  60. return *sf.val
  61. }
  62. // Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
  63. func (sf *Option[T]) Assert(msgFormat string, args ...any) T {
  64. Assert(sf.val != nil, msgFormat, args...)
  65. return *sf.val
  66. }