package main
import (
"fmt"
"reflect"
)
func curry( f interface{} ) func( interface{} ) func( interface{} ) interface{} {
return func( a interface{} ) func( interface{} ) interface{} {
return func( b interface{} ) interface{} {
ff := reflect.ValueOf(f)
va := reflect.ValueOf(a)
vb := reflect.ValueOf(b)
varg := [] reflect.Value { va, vb }
return ff.Call( varg )[0].Interface()
}
}
}
func main() {
csum := curry( func( a int, b int ) int { return a + b } )
add5 := csum( 5 )
r := add5( 2 )
fmt.Println( r.(int) )
}
cGFja2FnZSBtYWluCgppbXBvcnQgKAogICAgImZtdCIKICAgICJyZWZsZWN0IgopCgpmdW5jIGN1cnJ5KCBmIGludGVyZmFjZXt9ICkgZnVuYyggaW50ZXJmYWNle30gKSBmdW5jKCBpbnRlcmZhY2V7fSApIGludGVyZmFjZXt9IHsKICAgIHJldHVybiBmdW5jKCBhIGludGVyZmFjZXt9ICkgZnVuYyggaW50ZXJmYWNle30gKSBpbnRlcmZhY2V7fSB7CiAgICAgICAgcmV0dXJuIGZ1bmMoIGIgaW50ZXJmYWNle30gKSBpbnRlcmZhY2V7fSB7CiAgICAgICAgICAgIGZmIDo9IHJlZmxlY3QuVmFsdWVPZihmKQogICAgICAgICAgICB2YSA6PSByZWZsZWN0LlZhbHVlT2YoYSkKICAgICAgICAgICAgdmIgOj0gcmVmbGVjdC5WYWx1ZU9mKGIpCiAgICAgICAgICAgIHZhcmcgOj0gW10gcmVmbGVjdC5WYWx1ZSB7IHZhLCB2YiB9CiAgICAgICAgICAgIHJldHVybiBmZi5DYWxsKCB2YXJnIClbMF0uSW50ZXJmYWNlKCkKICAgICAgICB9CiAgICB9Cn0KCmZ1bmMgbWFpbigpIHsKICAgIGNzdW0gOj0gY3VycnkoIGZ1bmMoIGEgaW50LCBiIGludCApIGludCB7IHJldHVybiBhICsgYiB9ICkKICAgIGFkZDUgOj0gY3N1bSggNSApCiAgICByIDo9IGFkZDUoIDIgKQogICAgZm10LlByaW50bG4oIHIuKGludCkgKQp9