package async

import "reflect"

func Async(fn interface{}, args ...interface{}) func() {
	fnValue := reflect.ValueOf(fn)

	// Prepare the arguments
	params := make([]reflect.Value, len(args))
	for i, arg := range args {
		params[i] = reflect.ValueOf(arg)
	}

	// Return a function that, when called, will invoke the original function
	return func() {
		fnValue.Call(params)
	}
}