koption.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package ktypes
  2. import (
  3. "reflect"
  4. . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
  5. )
  6. // Option -- результат возможно содержащий nil
  7. type Option[T any] struct {
  8. val *T
  9. }
  10. // NewSome - полезный результат
  11. func NewSome[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. // IsSome - проверяет, есть ли значение
  28. func (sf *Option[T]) IsSome() bool {
  29. return sf.val != nil
  30. }
  31. // IsSome - проверяет, есть ли значение
  32. func (sf *Option[T]) IsNone() bool {
  33. return sf.val == nil
  34. }
  35. // Unwrap - извлекает значение (паника, если None)
  36. func (sf *Option[T]) Unwrap() T {
  37. Hassert(sf.val != nil, "Option[T].Unwrap(): val==nil!")
  38. return *sf.val
  39. }
  40. // UnwrapOr - возвращает значение или дефолтное
  41. func (sf Option[T]) UnwrapOr(defaultValue T) T {
  42. if sf.val == nil {
  43. return defaultValue
  44. }
  45. return *sf.val
  46. }
  47. // UnwrapOrFn -- возвращает значение, если оно есть, или результат выполнения функции
  48. func (sf *Option[T]) UnwrapOrFn(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) {
  57. Hassert(sf.val != nil, msgFormat, args...)
  58. }
  59. // Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде)
  60. func (sf *Option[T]) Assert(msgFormat string, args ...any) {
  61. Assert(sf.val != nil, msgFormat, args...)
  62. }