Skip to content

Instantly share code, notes, and snippets.

@loosechainsaw
Last active December 21, 2015 02:58
Show Gist options
  • Save loosechainsaw/6238388 to your computer and use it in GitHub Desktop.
Save loosechainsaw/6238388 to your computer and use it in GitHub Desktop.
CSharp Curry
using System;
namespace ConsoleApplication1
{
public static class FunctionalExtensions
{
public static Func<TResult> Curry<TArg1, TResult>(this Func<TArg1, TResult> func, TArg1 arg1)
{
return () => func(arg1);
}
public static Func<TArg2, TResult> Curry<TArg1, TArg2, TResult>(this Func<TArg1, TArg2, TResult> func, TArg1 arg1)
{
return x => func(arg1,x);
}
public static Func<TArg2, TArg3, TResult> Curry<TArg1, TArg2, TArg3, TResult>(this Func<TArg1, TArg2, TArg3, TResult> func, TArg1 arg1)
{
return (x, y) => func(arg1, x, y);
}
public static Func<TArg2, TArg3, TArg4, TResult> Curry<TArg1, TArg2, TArg3, TArg4, TResult>(this Func<TArg1, TArg2, TArg3, TArg4, TResult> func, TArg1 arg1)
{
return (x, y, z) => func(arg1, x, y, z);
}
public static Func<TArg2, TArg3, TArg4, TArg5, TResult> Curry<TArg1, TArg2, TArg3, TArg4, TArg5, TResult>(this Func<TArg1, TArg2, TArg3, TArg4, TArg5,TResult> func, TArg1 arg1)
{
return (a, b, c, d) => func(arg1, a, b, c, d);
}
public static Func<TArg2, TResult> Partial<TArg1, TArg2, TResult>(this Func<TArg1, TArg2, TResult> func, TArg1 arg1)
{
return x => func(arg1, x);
}
public static Func<TArg1, TResult> Partial<TArg1, TArg2, TResult>(this Func<TArg1, TArg2, TResult> func, TArg2 arg2)
{
return x => func(x, arg2);
}
public static Func<TArg2, TArg3, TResult> Partial<TArg1, TArg2, TArg3, TResult>(this Func<TArg1, TArg2, TArg3, TResult> func, TArg1 arg1)
{
return (x, y) => func(arg1, x, y);
}
public static Func<TArg1, TArg3, TResult> Partial<TArg1, TArg2, TArg3, TResult>(this Func<TArg1, TArg2, TArg3, TResult> func, TArg2 arg2)
{
return (x, y) => func(x, arg2, y);
}
public static Func<TArg1, TArg2, TResult> Partial<TArg1, TArg2, TArg3, TResult>(this Func<TArg1, TArg2, TArg3, TResult> func, TArg3 arg3)
{
return (x, y) => func(x, y, arg3);
}
}
class Program
{
static void Increment(Func<int, int> f, int value)
{
Console.WriteLine(f(value));
}
static void Main()
{
Func<int, int, int> increment = (x,y) => x + y + 1;
Increment(increment.Curry(10),10);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment