4 ms·
You can try for more runtime type safety (except it's still unityped), if you also use generic function call. Still ugly however, but at least usage is somewhat
by GlitchMr 9y ago
You can try for more runtime type safety (except it's still unityped), if you also use generic function call. Still ugly however, but at least usage is somewhat sane (even if compiler still won't inform you about errors).
package main
import (
"fmt"
"reflect"
)
func Reduce(array interface{}, initial interface{}, callback interface{}) interface{} {
arr := reflect.ValueOf(array)
memo := reflect.ValueOf(initial)
f := reflect.ValueOf(callback)
for i := 0; i < arr.Len(); i++ {
memo = f.Call([]reflect.Value{memo, arr.Index(i)})[0]
}
return memo
}
func main() {
list := []int{1, 2, 3, 4, 5}
result := Reduce(list, 0, func(initial int, value int) int {
return initial + value
})
fmt.Println(result)
}