github.com/golodash/godash@v1.3.0/functions/wrap_func.go (about) 1 package functions 2 3 import ( 4 "reflect" 5 6 "github.com/golodash/godash/internal" 7 ) 8 9 // Returns a function that invokes `function`, with passed `inputs` arguments. 10 // 11 // Complexity: O(n) 12 // 13 // n = length of `inputs` 14 func WrapFunc(function interface{}, inputs ...interface{}) func() []interface{} { 15 if ok := internal.IsFunc(function); !ok { 16 panic("`function` input is not a function") 17 } 18 19 functionType := reflect.TypeOf(function) 20 funcInLen := functionType.NumIn() 21 inputsLen := len(inputs) 22 defaultPanic := func() { panic("number of `function` inputs don't match with passed inputs") } 23 if inputsLen != funcInLen { 24 if funcInLen > inputsLen { 25 if !functionType.IsVariadic() { 26 defaultPanic() 27 } else if funcInLen-1 != inputsLen { 28 defaultPanic() 29 } 30 } else { 31 if funcInLen != 0 { 32 if !functionType.IsVariadic() { 33 defaultPanic() 34 } 35 } else { 36 defaultPanic() 37 } 38 } 39 } 40 41 funcInputs := []reflect.Value{} 42 for i := 0; i < inputsLen; i++ { 43 funcInputs = append(funcInputs, reflect.ValueOf(inputs[i])) 44 } 45 46 functionValue := reflect.ValueOf(function) 47 return func() []interface{} { 48 outputs := functionValue.Call(funcInputs) 49 actualOutputs := []interface{}{} 50 for i := 0; i < len(outputs); i++ { 51 actualOutputs = append(actualOutputs, outputs[i].Interface()) 52 } 53 54 return actualOutputs 55 } 56 }