maybe.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package ctn
  2. import "reflect"
  3. type Maybe[T any] func()(T,bool)
  4. func MakeMaybe[T any] (t T, ok bool) Maybe[T] {
  5. if ok {
  6. return Just(t)
  7. } else {
  8. return nil
  9. }
  10. }
  11. func Just[T any] (t T) Maybe[T] {
  12. return func() (T,bool) {
  13. return t, true
  14. }
  15. }
  16. func Nothing[T any] () Maybe[T] {
  17. return nil
  18. }
  19. func ReflectJust(v reflect.Value) reflect.Value {
  20. return reflect.MakeFunc(ReflectTypeMaybe(v.Type()), func([] reflect.Value) ([] reflect.Value) {
  21. return [] reflect.Value { v, reflect.ValueOf(true) }
  22. })
  23. }
  24. func ReflectNothing(t reflect.Type) reflect.Value {
  25. return reflect.Zero(ReflectTypeMaybe(t))
  26. }
  27. func (opt Maybe[T]) Value() (T,bool) {
  28. if opt != nil {
  29. return opt()
  30. } else {
  31. return zero[T](), false
  32. }
  33. }
  34. func ReflectMaybeValue(v reflect.Value) (reflect.Value, bool) {
  35. if v.IsNil() {
  36. return reflect.Value {}, false
  37. } else {
  38. return v.Call(nil)[0], true
  39. }
  40. }
  41. func ReflectTypeMaybe(t reflect.Type) reflect.Type {
  42. return reflect.FuncOf (
  43. [] reflect.Type {},
  44. [] reflect.Type { t, reflect.TypeOf(false) },
  45. false,
  46. )
  47. }
  48. func ReflectTypeMatchMaybe(t reflect.Type) (reflect.Type, bool) {
  49. if !(t.Kind() == reflect.Func) { return nil, false }
  50. if !(!(t.IsVariadic())) { return nil, false }
  51. if !(t.NumIn() == 0) { return nil, false }
  52. if !(t.NumOut() == 2) { return nil, false }
  53. if !(t.Out(1) == reflect.TypeOf(false)) { return nil, false }
  54. return t.Out(0), true
  55. }