Skip to content

Instantly share code, notes, and snippets.

@kazk
Created February 15, 2015 18:59
Show Gist options
  • Save kazk/60efb6e5c8cda4fd47ff to your computer and use it in GitHub Desktop.
Save kazk/60efb6e5c8cda4fd47ff to your computer and use it in GitHub Desktop.
// MARK: - Flip
/// Flips the order of function arguments.
///
/// :param: fn Function (A,B)→R
/// :returns: Function (B,A)→R
public func flip<A,B,R>(fn:(A,B)->R) -> (B,A)->R {
return {(b,a) in fn(a,b)}
}
/// Flips the order of function arguments.
///
/// :param: fn Function (A,B,C)→R
/// :returns: Function (C,B,A)→R
public func flip<A,B,C,R>(fn:(A,B,C)->R) -> (C,B,A)->R {
return {(c,b,a) in fn(a,b,c)}
}
/// Flips the order of function arguments.
///
/// :param: fn Function (A,B,C,D)→R
/// :returns: Function (D,C,B,A)→R
public func flip<A,B,C,D,R>(fn:(A,B,C,D)->R) -> (D,C,B,A)->R {
return {(d,c,b,a) in fn(a,b,c,d)}
}
/// Flips the order of function arguments.
///
/// :param: fn Function (A,B,C,D,E)→R
/// :returns: Function (E,D,C,B,A)→R
public func flip<A,B,C,D,E,R>(fn:(A,B,C,D,E)->R) -> (E,D,C,B,A)->R {
return {(e,d,c,b,a) in fn(a,b,c,d,e)}
}
/// Flips the order of function arguments.
///
/// :param: fn Function (A,B,C,D,E,F)→R
/// :returns: Function (F,E,D,C,B,A)→R
public func flip<A,B,C,D,E,F,R>(fn:(A,B,C,D,E,F)->R) -> (F,E,D,C,B,A)->R {
return {(f,e,d,c,b,a) in fn(a,b,c,d,e,f)}
}
/// Flips the order of function arguments.
///
/// :param: fn Function (A,B,C,D,E,F,G)→R
/// :returns: Function (G,F,E,D,C,B,A)→R
public func flip<A,B,C,D,E,F,G,R>(fn:(A,B,C,D,E,F,G)->R) -> (G,F,E,D,C,B,A)->R {
return {(g,f,e,d,c,b,a) in fn(a,b,c,d,e,f,g)}
}
// MARK: - Flip Curried
/// Flips the order of arguments of given curried function.
///
/// :param: fn A function (A)→(B)→R
/// :returns: A function (B)→(A)→R
public func flip<A,B,R>(fn:(A)->(B)->R) -> (B)->(A)->R {
return {b in {a in fn(a)(b)}}
}
/// Flips the order of arguments of given curried function.
///
/// :param: fn A function (A)→(B)→(C)→R
/// :returns: A function (C)→(B)→(A)→R
public func flip<A,B,C,R>(fn:(A)->(B)->(C)->R) -> (C)->(B)->(A)->R {
return {c in {b in {a in fn(a)(b)(c)}}}
}
/// Flips the order of arguments of given curried function.
///
/// :param: fn A function (A)→(B)→(C)→(D)→R
/// :returns: A function (D)→(C)→(B)→(A)→R
public func flip<A,B,C,D,R>(fn:(A)->(B)->(C)->(D)->R) -> (D)->(C)->(B)->(A)->R {
return {d in {c in {b in {a in fn(a)(b)(c)(d)}}}}
}
/// Flips the order of arguments of given curried function.
///
/// :param: fn A function (A)→(B)→(C)→(D)→(E)→R
/// :returns: A function (E)→(D)→(C)→(B)→(A)→R
public func flip<A,B,C,D,E,R>(fn:(A)->(B)->(C)->(D)->(E)->R) -> (E)->(D)->(C)->(B)->(A)->R {
return {e in {d in {c in {b in {a in fn(a)(b)(c)(d)(e)}}}}}
}
/// Flips the order of arguments of given curried function.
///
/// :param: fn A function (A)→(B)→(C)→(D)→(E)→(F)→R
/// :returns: A function (F)→(E)→(D)→(C)→(B)→(A)→R
public func flip<A,B,C,D,E,F,R>(fn:(A)->(B)->(C)->(D)->(E)->(F)->R) -> (F)->(E)->(D)->(C)->(B)->(A)->R {
return {f in {e in {d in {c in {b in {a in fn(a)(b)(c)(d)(e)(f)}}}}}}
}
/// Flips the order of arguments of given curried function.
///
/// :param: fn A function (A)→(B)→(C)→(D)→(E)→(F)→(G)→R
/// :returns: A function (G)→(F)→(E)→(D)→(C)→(B)→(A)→R
public func flip<A,B,C,D,E,F,G,R>(fn:(A)->(B)->(C)->(D)->(E)->(F)->(G)->R) -> (G)->(F)->(E)->(D)->(C)->(B)->(A)->R {
return {g in {f in {e in {d in {c in {b in {a in fn(a)(b)(c)(d)(e)(f)(g)}}}}}}}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment