Skip to content

Instantly share code, notes, and snippets.

@loosechainsaw
Created October 4, 2013 05:42
Show Gist options
  • Save loosechainsaw/6821440 to your computer and use it in GitHub Desktop.
Save loosechainsaw/6821440 to your computer and use it in GitHub Desktop.
Functional Object Oriented Synergy In C#
using System;
namespace Synergy
{
public class Unit
{
public static Unit Empty()
{
return new Unit();
}
}
public static class OperationAssistantFunctionalExtensions
{
public static Func<TResult> Curry<TArg1, TResult>(this Func<TArg1, TResult> function, TArg1 arg1)
{
return () => function(arg1);
}
public static Func<TArg2, TResult> Curry<TArg1, TArg2, TResult>(this Func<TArg1,TArg2,TResult> function, TArg1 arg1 )
{
return x => function(arg1, x);
}
public static Func<TArg2, Func<TArg3, TResult>> Curry<TArg1, TArg2, TArg3, TResult>(this Func<TArg1, TArg2, TArg3, TResult> function, TArg1 arg1)
{
return x => y => function(arg1, x, y);
}
public static Func<TArg2, Func<TArg3, Func<TArg4, TResult>>> Curry<TArg1, TArg2, TArg3, TArg4, TResult>(this Func<TArg1, TArg2, TArg3, TArg4, TResult> function, TArg1 arg1)
{
return u => v => w => function(arg1,u,v,w);
}
public static Func<TArg2, Func<TArg3, Func<TArg4, Func<TArg5, TResult>>>> Curry<TArg1, TArg2, TArg3, TArg4, TArg5, TResult>(this Func<TArg1, TArg2, TArg3, TArg4, TArg5, TResult> function, TArg1 arg1)
{
return u => v => w => x => function(arg1,u, v, w, x);
}
}
public static class Function
{
public static Function<TArg1, TResult> Create<TArg1, TResult>(
Func<TArg1, TResult> function)
{
Function<TArg1, TResult> result = function;
return result;
}
public static Function<TArg1, TArg2, TResult> Create<TArg1, TArg2, TResult>(
Func<TArg1, TArg2, TResult> function)
{
Function<TArg1, TArg2, TResult> result = function;
return result;
}
public static Function<TArg1, TArg2, TArg3, TResult> Create<TArg1, TArg2, TArg3, TResult>(
Func<TArg1, TArg2, TArg3, TResult> function)
{
Function<TArg1, TArg2, TArg3, TResult> result = function;
return result;
}
public static Function<TArg1, TArg2, TArg3, TArg4, TResult> Create<TArg1, TArg2, TArg3, TArg4, TResult>(
Func<TArg1, TArg2, TArg3, TArg4, TResult> function)
{
Function<TArg1, TArg2, TArg3, TArg4, TResult> result = function;
return result;
}
public static Function<TArg1, TArg2, TArg3, TArg4, TArg5, TResult> Create<TArg1, TArg2, TArg3, TArg4, TArg5, TResult>(
Func<TArg1, TArg2, TArg3, TArg4, TArg5, TResult> function)
{
Function<TArg1, TArg2, TArg3, TArg4, TArg5, TResult> result = function;
return result;
}
}
public class Function<TResult>
{
public Func<TResult> Func { get; set; }
public static implicit operator Function<TResult>(Func<TResult> function)
{
return new Function<TResult>
{
Func = function
};
}
}
public class Function<TArg1,TResult>
{
public Func<TArg1, TResult> Func { get; set; }
public static implicit operator Function<TArg1,TResult>(Func<TArg1,TResult> function)
{
return new Function<TArg1,TResult>
{
Func = function
};
}
public Function<TResult> Curry(TArg1 arg)
{
return new Function< TResult>
{
Func = Func.Curry(arg)
};
}
}
public class Function<TArg1, TArg2, TResult>
{
public Func<TArg1, TArg2, TResult> Func { get; set; }
public static implicit operator Function<TArg1, TArg2, TResult>(Func<TArg1, TArg2, TResult> function)
{
return new Function<TArg1, TArg2, TResult>
{
Func = function
};
}
public Function<TArg2,TResult> Curry(TArg1 arg)
{
return new Function<TArg2, TResult>
{
Func = Func.Curry(arg)
};
}
}
public class Function<TArg1, TArg2, TArg3, TResult>
{
public Func<TArg1, TArg2, TArg3, TResult> Func { get; set; }
public static implicit operator Function<TArg1, TArg2, TArg3, TResult>(Func<TArg1, TArg2, TArg3, TResult> function)
{
return new Function<TArg1, TArg2, TArg3, TResult>
{
Func = function
};
}
public Function<TArg2, TArg3, TResult> Curry(TArg1 arg)
{
return new Function<TArg2, TArg3, TResult>
{
Func = (arg2, arg3) => Func(arg,arg2,arg3)
};
}
}
public class Function<TArg1, TArg2, TArg3, TArg4, TResult>
{
public Func<TArg1, TArg2, TArg3, TArg4, TResult> Func { get; set; }
public static implicit operator Function<TArg1, TArg2, TArg3, TArg4, TResult>(Func<TArg1, TArg2, TArg3, TArg4, TResult> function)
{
return new Function<TArg1, TArg2, TArg3, TArg4, TResult>
{
Func = function
};
}
public Function<TArg2, TArg3, TArg4, TResult> Curry(TArg1 arg)
{
return new Function<TArg2, TArg3, TArg4, TResult>
{
Func = (arg2, arg3, arg4) => Func(arg, arg2, arg3,arg4)
};
}
}
public class Function<TArg1, TArg2, TArg3, TArg4, TArg5, TResult>
{
public Func<TArg1, TArg2, TArg3, TArg4, TArg5, TResult> Func { get; set; }
public static implicit operator Function<TArg1, TArg2, TArg3, TArg4, TArg5, TResult>(Func<TArg1, TArg2, TArg3, TArg4, TArg5, TResult> function)
{
return new Function<TArg1, TArg2, TArg3, TArg4, TArg5, TResult>
{
Func = function
};
}
public Function<TArg2, TArg3, TArg4, TArg5, TResult> Curry(TArg1 arg)
{
return new Function<TArg2, TArg3, TArg4, TArg5, TResult>
{
Func = (arg2, arg3, arg4, arg5) => Func(arg, arg2, arg3, arg4, arg5)
};
}
}
public class Example
{
public void DoIt()
{
var f = Function.Create<int,int, int, Unit>(Abc);
var a = f.Curry(1).Curry(2);
DoItAgain(f);
DoItAgain(new Func<int, int, int, Unit>(Abc));
}
public Unit Abc(int a, int b, int c)
{
return Unit.Empty();
}
public void DoItAgain(Function<int, int, int, Unit> function)
{
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment