koption.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package koption
  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() *Option[any] {
  23. return &Option[any]{nil}
  24. }
  25. // IsSome - проверяет, есть ли значение
  26. func (sf *Option[T]) IsSome() bool {
  27. return sf.val != nil
  28. }
  29. // IsSome - проверяет, есть ли значение
  30. func (sf *Option[T]) IsNone() bool {
  31. return sf.val == nil
  32. }
  33. // Unwrap - извлекает значение (паника, если None)
  34. func (sf *Option[T]) Unwrap() T {
  35. Hassert(sf.val != nil, "Option[T].Unwrap(): Called Unwrap on None!")
  36. return *sf.val
  37. }
  38. // UnwrapOr - возвращает значение или дефолтное
  39. func (sf Option[T]) UnwrapOr(defaultValue T) T {
  40. if sf.val == nil {
  41. return defaultValue
  42. }
  43. return *sf.val
  44. }
  45. // UnwrapOrFn -- возвращает значение, если оно есть, или результат выполнения функции
  46. func (sf *Option[T]) UnwrapOrFn(fn func() T) T {
  47. Hassert(fn != nil, "Result[T].UnwrapOrFn(): fn==nil")
  48. if sf.val == nil {
  49. return fn()
  50. }
  51. return *sf.val
  52. }
  53. // Hassert -- проверяет, что нет ошибки (с паникой)
  54. func (sf *Option[T]) Hassert(msg string) {
  55. Hassert(sf.val != nil, msg+", val==nil\n")
  56. }
  57. // Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде)
  58. func (sf *Option[T]) Assert(msg string) {
  59. Assert(sf.val != nil, msg+", val=%v\n")
  60. }