Skip to content

Instantly share code, notes, and snippets.

@fowlmouth
Last active December 16, 2015 16:19
Show Gist options
  • Save fowlmouth/5462316 to your computer and use it in GitHub Desktop.
Save fowlmouth/5462316 to your computer and use it in GitHub Desktop.
proc curry[A, Ret] (
func: proc(someA: A): Ret,
valueA: A): proc: Ret =
return proc: Ret = func(valueA)
proc curry[A,B, Ret] (
func: proc(someA: A, someB: B): Ret,
valueA: A): proc(someB: B): Ret =
return proc(someB: B): Ret = func(valueA, someB)
proc curry[A,B,C, Ret] (
func: proc(someA: A, someB: B, someC: C): Ret,
valueA: A): proc(someB: B, someC: C): Ret =
return proc(someB: B, someC: C): Ret = func(valueA, someB, someC)
proc curry[A,B,C,D, Ret] (
func: proc(someA:A, someB:B, someC:C, someD:D): Ret,
valueA: A): proc(someB:B,someC:C,someD:D): Ret =
return proc(someB:B,someC:C,someD:D): Ret = func(valueA, someB,someC,someD)
proc foo(a, b: int): int =
return a * b
proc foo2(a: int, b: float, c: float): float =
return a.float * b / c
let f = foo.curry(42)
echo f(2)
let f2 = foo2.curry(10).curry(10.0)
echo f2(1.0).int
proc squaz(some: int) = echo(some)
curry[int,void](squaz, 9001)()
curry(squaz, 9001)()
# ^ wont work without
proc curry[A] (func: proc(someA: A), valueA: A): proc() =
return proc = func(valueA)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment