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  }