option.go 2.1 KB

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