Created
June 6, 2016 04:17
-
-
Save zhigang1992/182f28c932be0550654d0ebe2d988163 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//data | |
import Foundation | |
let input:NSDictionary = [ | |
"id": 123, | |
"name": "Awesome Name", | |
"createdAt": "2011-12-12", | |
"avatar": [ | |
"url": "http://www.google.com", | |
"size": [ | |
"width": 123, | |
"height": 12, | |
], | |
], | |
"followers": [ | |
[ | |
"name": "User 1", | |
"id": 1234 | |
], | |
[ | |
"name": "User 2", | |
"id": 12345 | |
] | |
] | |
] | |
let userData = [ | |
"name": "User 2", | |
"id": 12345 | |
] | |
struct User : Parsable { | |
let name: String | |
let id: Double | |
static var parser: Parser<User> { | |
return curry(User.init) <^> "name" <*> "id" | |
} | |
} | |
struct Me : Parsable { | |
let id: Int | |
let name: String? | |
let followers: [User] | |
let avatar: String | |
static var parser: Parser<Me> { | |
return curry(Me.init) | |
<^> "id" | |
<*> "name" | |
<*> "followers" | |
<*> "avatar" | |
} | |
} | |
print(User.parser.parse(userData)) | |
print(Me.parser.parse(input)) | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public func curry<A, B>(function: (A) -> B) -> A -> B { | |
return { (`a`: A) -> B in function(`a`) } | |
} | |
public func curry<A, B, C>(function: (A, B) -> C) -> A -> B -> C { | |
return { (`a`: A) -> B -> C in { (`b`: B) -> C in function(`a`, `b`) } } | |
} | |
public func curry<A, B, C, D>(function: (A, B, C) -> D) -> A -> B -> C -> D { | |
return { (`a`: A) -> B -> C -> D in { (`b`: B) -> C -> D in { (`c`: C) -> D in function(`a`, `b`, `c`) } } } | |
} | |
public func curry<A, B, C, D, E>(function: (A, B, C, D) -> E) -> A -> B -> C -> D -> E { | |
return { (`a`: A) -> B -> C -> D -> E in { (`b`: B) -> C -> D -> E in { (`c`: C) -> D -> E in { (`d`: D) -> E in function(`a`, `b`, `c`, `d`) } } } } | |
} | |
public func curry<A, B, C, D, E, F>(function: (A, B, C, D, E) -> F) -> A -> B -> C -> D -> E -> F { | |
return { (`a`: A) -> B -> C -> D -> E -> F in { (`b`: B) -> C -> D -> E -> F in { (`c`: C) -> D -> E -> F in { (`d`: D) -> E -> F in { (`e`: E) -> F in function(`a`, `b`, `c`, `d`, `e`) } } } } } | |
} | |
public func curry<A, B, C, D, E, F, G>(function: (A, B, C, D, E, F) -> G) -> A -> B -> C -> D -> E -> F -> G { | |
return { (`a`: A) -> B -> C -> D -> E -> F -> G in { (`b`: B) -> C -> D -> E -> F -> G in { (`c`: C) -> D -> E -> F -> G in { (`d`: D) -> E -> F -> G in { (`e`: E) -> F -> G in { (`f`: F) -> G in function(`a`, `b`, `c`, `d`, `e`, `f`) } } } } } } | |
} | |
public func curry<A, B, C, D, E, F, G, H>(function: (A, B, C, D, E, F, G) -> H) -> A -> B -> C -> D -> E -> F -> G -> H { | |
return { (`a`: A) -> B -> C -> D -> E -> F -> G -> H in { (`b`: B) -> C -> D -> E -> F -> G -> H in { (`c`: C) -> D -> E -> F -> G -> H in { (`d`: D) -> E -> F -> G -> H in { (`e`: E) -> F -> G -> H in { (`f`: F) -> G -> H in { (`g`: G) -> H in function(`a`, `b`, `c`, `d`, `e`, `f`, `g`) } } } } } } } | |
} | |
public func curry<A, B, C, D, E, F, G, H, I>(function: (A, B, C, D, E, F, G, H) -> I) -> A -> B -> C -> D -> E -> F -> G -> H -> I { | |
return { (`a`: A) -> B -> C -> D -> E -> F -> G -> H -> I in { (`b`: B) -> C -> D -> E -> F -> G -> H -> I in { (`c`: C) -> D -> E -> F -> G -> H -> I in { (`d`: D) -> E -> F -> G -> H -> I in { (`e`: E) -> F -> G -> H -> I in { (`f`: F) -> G -> H -> I in { (`g`: G) -> H -> I in { (`h`: H) -> I in function(`a`, `b`, `c`, `d`, `e`, `f`, `g`, `h`) } } } } } } } } | |
} | |
public func curry<A, B, C, D, E, F, G, H, I, J>(function: (A, B, C, D, E, F, G, H, I) -> J) -> A -> B -> C -> D -> E -> F -> G -> H -> I -> J { | |
return { (`a`: A) -> B -> C -> D -> E -> F -> G -> H -> I -> J in { (`b`: B) -> C -> D -> E -> F -> G -> H -> I -> J in { (`c`: C) -> D -> E -> F -> G -> H -> I -> J in { (`d`: D) -> E -> F -> G -> H -> I -> J in { (`e`: E) -> F -> G -> H -> I -> J in { (`f`: F) -> G -> H -> I -> J in { (`g`: G) -> H -> I -> J in { (`h`: H) -> I -> J in { (`i`: I) -> J in function(`a`, `b`, `c`, `d`, `e`, `f`, `g`, `h`, `i`) } } } } } } } } } | |
} | |
public func curry<A, B, C, D, E, F, G, H, I, J, K>(function: (A, B, C, D, E, F, G, H, I, J) -> K) -> A -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K { | |
return { (`a`: A) -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K in { (`b`: B) -> C -> D -> E -> F -> G -> H -> I -> J -> K in { (`c`: C) -> D -> E -> F -> G -> H -> I -> J -> K in { (`d`: D) -> E -> F -> G -> H -> I -> J -> K in { (`e`: E) -> F -> G -> H -> I -> J -> K in { (`f`: F) -> G -> H -> I -> J -> K in { (`g`: G) -> H -> I -> J -> K in { (`h`: H) -> I -> J -> K in { (`i`: I) -> J -> K in { (`j`: J) -> K in function(`a`, `b`, `c`, `d`, `e`, `f`, `g`, `h`, `i`, `j`) } } } } } } } } } } | |
} | |
public func curry<A, B, C, D, E, F, G, H, I, J, K, L>(function: (A, B, C, D, E, F, G, H, I, J, K) -> L) -> A -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L { | |
return { (`a`: A) -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L in { (`b`: B) -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L in { (`c`: C) -> D -> E -> F -> G -> H -> I -> J -> K -> L in { (`d`: D) -> E -> F -> G -> H -> I -> J -> K -> L in { (`e`: E) -> F -> G -> H -> I -> J -> K -> L in { (`f`: F) -> G -> H -> I -> J -> K -> L in { (`g`: G) -> H -> I -> J -> K -> L in { (`h`: H) -> I -> J -> K -> L in { (`i`: I) -> J -> K -> L in { (`j`: J) -> K -> L in { (`k`: K) -> L in function(`a`, `b`, `c`, `d`, `e`, `f`, `g`, `h`, `i`, `j`, `k`) } } } } } } } } } } } | |
} | |
public func curry<A, B, C, D, E, F, G, H, I, J, K, L, M>(function: (A, B, C, D, E, F, G, H, I, J, K, L) -> M) -> A -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M { | |
return { (`a`: A) -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M in { (`b`: B) -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M in { (`c`: C) -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M in { (`d`: D) -> E -> F -> G -> H -> I -> J -> K -> L -> M in { (`e`: E) -> F -> G -> H -> I -> J -> K -> L -> M in { (`f`: F) -> G -> H -> I -> J -> K -> L -> M in { (`g`: G) -> H -> I -> J -> K -> L -> M in { (`h`: H) -> I -> J -> K -> L -> M in { (`i`: I) -> J -> K -> L -> M in { (`j`: J) -> K -> L -> M in { (`k`: K) -> L -> M in { (`l`: L) -> M in function(`a`, `b`, `c`, `d`, `e`, `f`, `g`, `h`, `i`, `j`, `k`, `l`) } } } } } } } } } } } } | |
} | |
public func curry<A, B, C, D, E, F, G, H, I, J, K, L, M, N>(function: (A, B, C, D, E, F, G, H, I, J, K, L, M) -> N) -> A -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N { | |
return { (`a`: A) -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N in { (`b`: B) -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N in { (`c`: C) -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N in { (`d`: D) -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N in { (`e`: E) -> F -> G -> H -> I -> J -> K -> L -> M -> N in { (`f`: F) -> G -> H -> I -> J -> K -> L -> M -> N in { (`g`: G) -> H -> I -> J -> K -> L -> M -> N in { (`h`: H) -> I -> J -> K -> L -> M -> N in { (`i`: I) -> J -> K -> L -> M -> N in { (`j`: J) -> K -> L -> M -> N in { (`k`: K) -> L -> M -> N in { (`l`: L) -> M -> N in { (`m`: M) -> N in function(`a`, `b`, `c`, `d`, `e`, `f`, `g`, `h`, `i`, `j`, `k`, `l`, `m`) } } } } } } } } } } } } } | |
} | |
public func curry<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(function: (A, B, C, D, E, F, G, H, I, J, K, L, M, N) -> O) -> A -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O { | |
return { (`a`: A) -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O in { (`b`: B) -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O in { (`c`: C) -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O in { (`d`: D) -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O in { (`e`: E) -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O in { (`f`: F) -> G -> H -> I -> J -> K -> L -> M -> N -> O in { (`g`: G) -> H -> I -> J -> K -> L -> M -> N -> O in { (`h`: H) -> I -> J -> K -> L -> M -> N -> O in { (`i`: I) -> J -> K -> L -> M -> N -> O in { (`j`: J) -> K -> L -> M -> N -> O in { (`k`: K) -> L -> M -> N -> O in { (`l`: L) -> M -> N -> O in { (`m`: M) -> N -> O in { (`n`: N) -> O in function(`a`, `b`, `c`, `d`, `e`, `f`, `g`, `h`, `i`, `j`, `k`, `l`, `m`, `n`) } } } } } } } } } } } } } } | |
} | |
public func curry<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P>(function: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) -> P) -> A -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P { | |
return { (`a`: A) -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P in { (`b`: B) -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P in { (`c`: C) -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P in { (`d`: D) -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P in { (`e`: E) -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P in { (`f`: F) -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P in { (`g`: G) -> H -> I -> J -> K -> L -> M -> N -> O -> P in { (`h`: H) -> I -> J -> K -> L -> M -> N -> O -> P in { (`i`: I) -> J -> K -> L -> M -> N -> O -> P in { (`j`: J) -> K -> L -> M -> N -> O -> P in { (`k`: K) -> L -> M -> N -> O -> P in { (`l`: L) -> M -> N -> O -> P in { (`m`: M) -> N -> O -> P in { (`n`: N) -> O -> P in { (`o`: O) -> P in function(`a`, `b`, `c`, `d`, `e`, `f`, `g`, `h`, `i`, `j`, `k`, `l`, `m`, `n`, `o`) } } } } } } } } } } } } } } } | |
} | |
public func curry<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q>(function: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P) -> Q) -> A -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q { | |
return { (`a`: A) -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q in { (`b`: B) -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q in { (`c`: C) -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q in { (`d`: D) -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q in { (`e`: E) -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q in { (`f`: F) -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q in { (`g`: G) -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q in { (`h`: H) -> I -> J -> K -> L -> M -> N -> O -> P -> Q in { (`i`: I) -> J -> K -> L -> M -> N -> O -> P -> Q in { (`j`: J) -> K -> L -> M -> N -> O -> P -> Q in { (`k`: K) -> L -> M -> N -> O -> P -> Q in { (`l`: L) -> M -> N -> O -> P -> Q in { (`m`: M) -> N -> O -> P -> Q in { (`n`: N) -> O -> P -> Q in { (`o`: O) -> P -> Q in { (`p`: P) -> Q in function(`a`, `b`, `c`, `d`, `e`, `f`, `g`, `h`, `i`, `j`, `k`, `l`, `m`, `n`, `o`, `p`) } } } } } } } } } } } } } } } } | |
} | |
public func curry<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R>(function: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q) -> R) -> A -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R { | |
return { (`a`: A) -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R in { (`b`: B) -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R in { (`c`: C) -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R in { (`d`: D) -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R in { (`e`: E) -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R in { (`f`: F) -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R in { (`g`: G) -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R in { (`h`: H) -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R in { (`i`: I) -> J -> K -> L -> M -> N -> O -> P -> Q -> R in { (`j`: J) -> K -> L -> M -> N -> O -> P -> Q -> R in { (`k`: K) -> L -> M -> N -> O -> P -> Q -> R in { (`l`: L) -> M -> N -> O -> P -> Q -> R in { (`m`: M) -> N -> O -> P -> Q -> R in { (`n`: N) -> O -> P -> Q -> R in { (`o`: O) -> P -> Q -> R in { (`p`: P) -> Q -> R in { (`q`: Q) -> R in function(`a`, `b`, `c`, `d`, `e`, `f`, `g`, `h`, `i`, `j`, `k`, `l`, `m`, `n`, `o`, `p`, `q`) } } } } } } } } } } } } } } } } } | |
} | |
public func curry<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S>(function: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R) -> S) -> A -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S { | |
return { (`a`: A) -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S in { (`b`: B) -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S in { (`c`: C) -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S in { (`d`: D) -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S in { (`e`: E) -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S in { (`f`: F) -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S in { (`g`: G) -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S in { (`h`: H) -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S in { (`i`: I) -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S in { (`j`: J) -> K -> L -> M -> N -> O -> P -> Q -> R -> S in { (`k`: K) -> L -> M -> N -> O -> P -> Q -> R -> S in { (`l`: L) -> M -> N -> O -> P -> Q -> R -> S in { (`m`: M) -> N -> O -> P -> Q -> R -> S in { (`n`: N) -> O -> P -> Q -> R -> S in { (`o`: O) -> P -> Q -> R -> S in { (`p`: P) -> Q -> R -> S in { (`q`: Q) -> R -> S in { (`r`: R) -> S in function(`a`, `b`, `c`, `d`, `e`, `f`, `g`, `h`, `i`, `j`, `k`, `l`, `m`, `n`, `o`, `p`, `q`, `r`) } } } } } } } } } } } } } } } } } } | |
} | |
public func curry<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T>(function: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S) -> T) -> A -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T { | |
return { (`a`: A) -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T in { (`b`: B) -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T in { (`c`: C) -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T in { (`d`: D) -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T in { (`e`: E) -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T in { (`f`: F) -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T in { (`g`: G) -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T in { (`h`: H) -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T in { (`i`: I) -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T in { (`j`: J) -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T in { (`k`: K) -> L -> M -> N -> O -> P -> Q -> R -> S -> T in { (`l`: L) -> M -> N -> O -> P -> Q -> R -> S -> T in { (`m`: M) -> N -> O -> P -> Q -> R -> S -> T in { (`n`: N) -> O -> P -> Q -> R -> S -> T in { (`o`: O) -> P -> Q -> R -> S -> T in { (`p`: P) -> Q -> R -> S -> T in { (`q`: Q) -> R -> S -> T in { (`r`: R) -> S -> T in { (`s`: S) -> T in function(`a`, `b`, `c`, `d`, `e`, `f`, `g`, `h`, `i`, `j`, `k`, `l`, `m`, `n`, `o`, `p`, `q`, `r`, `s`) } } } } } } } } } } } } } } } } } } } | |
} | |
public func curry<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U>(function: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T) -> U) -> A -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U { | |
return { (`a`: A) -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U in { (`b`: B) -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U in { (`c`: C) -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U in { (`d`: D) -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U in { (`e`: E) -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U in { (`f`: F) -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U in { (`g`: G) -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U in { (`h`: H) -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U in { (`i`: I) -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U in { (`j`: J) -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U in { (`k`: K) -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U in { (`l`: L) -> M -> N -> O -> P -> Q -> R -> S -> T -> U in { (`m`: M) -> N -> O -> P -> Q -> R -> S -> T -> U in { (`n`: N) -> O -> P -> Q -> R -> S -> T -> U in { (`o`: O) -> P -> Q -> R -> S -> T -> U in { (`p`: P) -> Q -> R -> S -> T -> U in { (`q`: Q) -> R -> S -> T -> U in { (`r`: R) -> S -> T -> U in { (`s`: S) -> T -> U in { (`t`: T) -> U in function(`a`, `b`, `c`, `d`, `e`, `f`, `g`, `h`, `i`, `j`, `k`, `l`, `m`, `n`, `o`, `p`, `q`, `r`, `s`, `t`) } } } } } } } } } } } } } } } } } } } } | |
} | |
public func curry<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V>(function: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U) -> V) -> A -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U -> V { | |
return { (`a`: A) -> B -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U -> V in { (`b`: B) -> C -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U -> V in { (`c`: C) -> D -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U -> V in { (`d`: D) -> E -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U -> V in { (`e`: E) -> F -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U -> V in { (`f`: F) -> G -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U -> V in { (`g`: G) -> H -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U -> V in { (`h`: H) -> I -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U -> V in { (`i`: I) -> J -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U -> V in { (`j`: J) -> K -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U -> V in { (`k`: K) -> L -> M -> N -> O -> P -> Q -> R -> S -> T -> U -> V in { (`l`: L) -> M -> N -> O -> P -> Q -> R -> S -> T -> U -> V in { (`m`: M) -> N -> O -> P -> Q -> R -> S -> T -> U -> V in { (`n`: N) -> O -> P -> Q -> R -> S -> T -> U -> V in { (`o`: O) -> P -> Q -> R -> S -> T -> U -> V in { (`p`: P) -> Q -> R -> S -> T -> U -> V in { (`q`: Q) -> R -> S -> T -> U -> V in { (`r`: R) -> S -> T -> U -> V in { (`s`: S) -> T -> U -> V in { (`t`: T) -> U -> V in { (`u`: U) -> V in function(`a`, `b`, `c`, `d`, `e`, `f`, `g`, `h`, `i`, `j`, `k`, `l`, `m`, `n`, `o`, `p`, `q`, `r`, `s`, `t`, `u`) } } } } } } } } } } } } } } } } } } } } } | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public enum Result<T> { | |
case Success(T) | |
case Failure(String) | |
public static func fromOptional(value: T?, error: String) -> Result { | |
if let value = value { | |
return .Success(value) | |
} | |
return .Failure(error) | |
} | |
} | |
public struct Parser<T> { | |
public let parse: (AnyObject)->Result<T> | |
public init(parse:(AnyObject)->Result<T>) { | |
self.parse = parse | |
} | |
} | |
extension Parser { | |
static func unit(value:T) -> Parser { | |
return Parser<T> { _ in | |
return .Success(value) | |
} | |
} | |
func flatMap<U>(function: T->Parser<U>) -> Parser<U> { | |
return Parser<U> { input in | |
switch self.parse(input) { | |
case .Success(let t): return function(t).parse(input) | |
case .Failure(let error): return .Failure(error) | |
} | |
} | |
} | |
} | |
infix operator >== { associativity left } // flatMap | |
infix operator <^> { associativity left } // map | |
infix operator <*> { associativity left } // apply | |
public func >==<T, U>(left: Parser<T>, function: T->Parser<U>) -> Parser<U> { | |
return left.flatMap(function) | |
} | |
public func <^><T, U>(function: T->U, parser: Parser<T>) -> Parser<U> { | |
return parser.flatMap({Parser.unit(function($0))}) | |
} | |
public func <*><T, U>(functionParser: Parser<T->U>, parser: Parser<T>) -> Parser<U> { | |
return functionParser.flatMap({ $0 <^> parser }) | |
} | |
import Foundation | |
public func dictionaryParser<T>(key:String, parser:Parser<T>) -> Parser<T> { | |
return Parser<T> { input in | |
guard let dictionary = input as? NSDictionary else { | |
return .Failure("\(input) is not an dictionary") | |
} | |
guard let data = dictionary[key] else { | |
return .Failure("\(key) does not exist in \(input)") | |
} | |
return parser.parse(data) | |
} | |
} | |
public func arrayParser<T>(parser: Parser<T>) -> Parser<[T]> { | |
return Parser { input in | |
guard let array = input as? NSArray else { | |
return .Failure("\(input) is not an array") | |
} | |
var result:[T] = [] | |
for input in array { | |
switch (parser.parse(input)) { | |
case .Success(let value): result.append(value) | |
case .Failure(let failure): return .Failure(failure) | |
} | |
} | |
return .Success(result) | |
} | |
} | |
public func optionalParser<T>(parser: Parser<T>) -> Parser<Optional<T>> { | |
return Parser { input in | |
switch (parser.parse(input)) { | |
case .Success(let value): return .Success(.Some(value)) | |
case .Failure: return .Success(.None) | |
} | |
} | |
} | |
public protocol Parsable { | |
static var parser: Parser<Self> { get } | |
} | |
public func <^><T:Parsable, U>(function:T->U, key: String) -> Parser<U> { | |
return function <^> dictionaryParser(key, parser: T.parser) | |
} | |
public func <*><T:Parsable, U>(fp: Parser<T->U>, key: String) -> Parser<U> { | |
return fp >== { $0 <^> key } | |
} | |
public func <^><T:Parsable, U>(function:T?->U, key: String) -> Parser<U> { | |
return function <^> optionalParser(dictionaryParser(key, parser: T.parser)) | |
} | |
public func <*><T:Parsable, U>(fp: Parser<T?->U>, key: String) -> Parser<U> { | |
return fp >== { $0 <^> key } | |
} | |
public func <^><T:Parsable, U>(function:[T]->U, key: String) -> Parser<U> { | |
return function <^> dictionaryParser(key, parser: arrayParser(T.parser)) | |
} | |
public func <*><T:Parsable, U>(fp: Parser<[T]->U>, key: String) -> Parser<U> { | |
return fp >== { $0 <^> key } | |
} | |
extension String : Parsable { | |
public static var parser: Parser<String> { | |
return Parser { | |
.fromOptional($0 as? String, error: "\($0) is not an string") | |
} | |
} | |
} | |
extension Bool : Parsable { | |
public static var parser: Parser<Bool> { | |
return Parser { .fromOptional(($0 as? NSNumber)?.boolValue, error: "\($0) is not a number") } | |
} | |
} | |
extension Double : Parsable { | |
public static var parser: Parser<Double> { | |
return Parser { .fromOptional(($0 as? NSNumber)?.doubleValue, error: "\($0) is not a number") } | |
} | |
} | |
extension Int: Parsable { | |
public static var parser: Parser<Int> { | |
return Parser { .fromOptional(($0 as? NSNumber)?.integerValue, error: "\($0) is not a number") } | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment