38 lines
625 B
Go
38 lines
625 B
Go
|
package fun
|
||
|
|
||
|
import (
|
||
|
"reflect"
|
||
|
)
|
||
|
|
||
|
func zeroValue(typ reflect.Type) reflect.Value {
|
||
|
return reflect.New(typ).Elem()
|
||
|
}
|
||
|
|
||
|
type swapper reflect.Value
|
||
|
|
||
|
func swapperOf(typ reflect.Type) swapper {
|
||
|
return swapper(zeroValue(typ))
|
||
|
}
|
||
|
|
||
|
func (s swapper) swap(a, b reflect.Value) {
|
||
|
vs := reflect.Value(s)
|
||
|
vs.Set(a)
|
||
|
a.Set(b)
|
||
|
b.Set(vs)
|
||
|
}
|
||
|
|
||
|
func call(f reflect.Value, args ...reflect.Value) {
|
||
|
f.Call(args)
|
||
|
}
|
||
|
|
||
|
func call1(f reflect.Value, args ...reflect.Value) reflect.Value {
|
||
|
return f.Call(args)[0]
|
||
|
}
|
||
|
|
||
|
func call2(f reflect.Value, args ...reflect.Value) (
|
||
|
reflect.Value, reflect.Value) {
|
||
|
|
||
|
ret := f.Call(args)
|
||
|
return ret[0], ret[1]
|
||
|
}
|