pair.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package ctn
  2. import "reflect"
  3. type Pair[A any, B any] func()(A,B)
  4. func MakePair[A any, B any] (a A, b B) Pair[A,B] {
  5. return func() (A,B) {
  6. return a, b
  7. }
  8. }
  9. func ReflectMakePair(a reflect.Value, b reflect.Value) reflect.Value {
  10. return reflect.MakeFunc(ReflectTypePair(a.Type(), b.Type()), func([] reflect.Value) ([] reflect.Value) {
  11. return [] reflect.Value { a, b }
  12. })
  13. }
  14. func (p Pair[A,B]) First() A {
  15. var a, _ = p()
  16. return a
  17. }
  18. func (p Pair[A,B]) Second() B {
  19. var _, b = p()
  20. return b
  21. }
  22. func (p Pair[K,V]) Key() K {
  23. return p.First()
  24. }
  25. func (p Pair[K,V]) Value() V {
  26. return p.Second()
  27. }
  28. func ReflectPairUnpack(v reflect.Value) (reflect.Value, reflect.Value) {
  29. var ret = v.Call(nil)
  30. return ret[0], ret[1]
  31. }
  32. func ReflectTypePair(a reflect.Type, b reflect.Type) reflect.Type {
  33. return reflect.FuncOf (
  34. [] reflect.Type {},
  35. [] reflect.Type { a, b },
  36. false,
  37. )
  38. }
  39. func ReflectTypeMatchPair(t reflect.Type) (reflect.Type, reflect.Type, bool) {
  40. if !(t.Kind() == reflect.Func) { return nil, nil, false }
  41. if !(!(t.IsVariadic())) { return nil, nil, false }
  42. if !(t.NumIn() == 0) { return nil, nil, false }
  43. if !(t.NumOut() == 2) { return nil, nil, false }
  44. return t.Out(0), t.Out(1), true
  45. }