Skip to content

Instantly share code, notes, and snippets.

@yuchiki
Created April 25, 2019 13:43
Show Gist options
  • Save yuchiki/052f989e3da47978c4224423a4b4d414 to your computer and use it in GitHub Desktop.
Save yuchiki/052f989e3da47978c4224423a4b4d414 to your computer and use it in GitHub Desktop.
static class Combinators {
public static void Pipe<T>(this T t, Action<T> a) => a(t);
public static T Pipe<S, T>(this S s, Func<S, T> f) => f(s);
public static Func<S, U> Then<S, T, U>(this Func<S, T> f, Func<T, U> g) => s => g(f(s));
public static Func<T, S, U> Flip<S, T, U>(this Func<S, T, U> f) => (t, s) => f(s, t);
public static Func<T, Func<S, U>> Flip<S, T, U>(this Func<S, Func<T, U>> f) => t => s => f(s)(t);
public static T Ident<T>(this T t) => t;
public static S Const<S, T>(this S s, T t) => s;
public static Func<T, S> Const<S, T>(this S s) => t => s;
public static X Substitute<X, Y, Z>(this Func<Z, Y, X> x, Func<Z, Y> y, Z z) => x(z, y(z));
public static Func<Func<Z,Y>, Func<Z, X>> Substitute<X, Y, Z>(this Func<Z, Func<Y, X>> x) => y => z => x(z)(y(z));
public static Func<Y, X> CombT<X, Y>(this X x) => Const<X,Y>(x);
public static Func<Y, Y> CombF<X, Y>(this X x) => Ident;
public static Func<T1, Action<T2>> Curry<T1, T2>(this Action<T1, T2> a) => t1 => t2 => a(t1, t2);
public static Func<T1, Func<T2, Action<T3>>> Curry<T1, T2, T3>(this Action<T1, T2, T3> a) => t1 => t2 => t3 => a(t1, t2, t3);
public static Func<T1, Func<T2, Func<T3, Action<T4>>>> Curry<T1, T2, T3, T4>(this Action<T1, T2, T3, T4> a) => t1 => t2 => t3 => t4 => a(t1, t2, t3, t4);
public static Func<T1, Func<T2, Func<T3, Func<T4, Action<T5>>>>> Curry<T1, T2, T3, T4, T5>(this Action<T1, T2, T3, T4, T5> a) => t1 => t2 => t3 => t4 => t5 => a(t1, t2, t3, t4, t5);
public static Func<T1, Func<T2, Func<T3, Func<T4, Func<T5, Action<T6>>>>>> Curry<T1, T2, T3, T4, T5, T6>(this Action<T1, T2, T3, T4, T5, T6> a) => t1 => t2 => t3 => t4 => t5 => t6 => a(t1, t2, t3, t4, t5, t6);
public static Func<T1, Func<T2, Func<T3, Func<T4, Func<T5, Func<T6, Action<T7>>>>>>> Curry<T1, T2, T3, T4, T5, T6, T7>(this Action<T1, T2, T3, T4, T5, T6, T7> a) => t1 => t2 => t3 => t4 => t5 => t6 => t7 => a(t1, t2, t3, t4, t5, t6, t7);
public static Func<T1, Func<T2, Func<T3, Func<T4, Func<T5, Func<T6, Func<T7, Action<T8>>>>>>>> Curry<T1, T2, T3, T4, T5, T6, T7, T8>(this Action<T1, T2, T3, T4, T5, T6, T7, T8> a) => t1 => t2 => t3 => t4 => t5 => t6 => t7 => t8 => a(t1, t2, t3, t4, t5, t6, t7, t8);
public static Func<T1, Func<T2, T3>> Curry<T1, T2, T3>(this Func<T1, T2, T3> a) => t1 => t2 => a(t1, t2);
public static Func<T1, Func<T2, Func<T3, T4>>> Curry<T1, T2, T3, T4>(this Func<T1, T2, T3, T4> a) => t1 => t2 => t3 => a(t1, t2, t3);
public static Func<T1, Func<T2, Func<T3, Func<T4, T5>>>> Curry<T1, T2, T3, T4, T5>(this Func<T1, T2, T3, T4, T5> a) => t1 => t2 => t3 => t4 => a(t1, t2, t3, t4);
public static Func<T1, Func<T2, Func<T3, Func<T4, Func<T5, T6>>>>> Curry<T1, T2, T3, T4, T5, T6>(this Func<T1, T2, T3, T4, T5, T6> a) => t1 => t2 => t3 => t4 => t5 => a(t1, t2, t3, t4, t5);
public static Func<T1, Func<T2, Func<T3, Func<T4, Func<T5, Func<T6, T7>>>>>> Curry<T1, T2, T3, T4, T5, T6, T7>(this Func<T1, T2, T3, T4, T5, T6, T7> a) => t1 => t2 => t3 => t4 => t5 => t6 => a(t1, t2, t3, t4, t5, t6);
public static Func<T1, Func<T2, Func<T3, Func<T4, Func<T5, Func<T6, Func<T7, T8>>>>>>> Curry<T1, T2, T3, T4, T5, T6, T7, T8>(this Func<T1, T2, T3, T4, T5, T6, T7, T8> a) => t1 => t2 => t3 => t4 => t5 => t6 => t7 => a(t1, t2, t3, t4, t5, t6, t7);
}
// T1 * T2 -> () => T1 -> T2 -> ()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment