Created
July 19, 2018 21:05
-
-
Save DylanLukes/748fee181de67ad38b5596137bf4b095 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
// | |
// NilCollapse.swift | |
// | |
// Created by Dylan Lukes on 7/19/18. | |
// | |
// No Rights Reserved. | |
extension Collection { | |
subscript (safe index: Index) -> Element? { | |
return indices.contains(index) ? self[index] : nil | |
} | |
} | |
postfix operator ¿ | |
postfix func ¿<A1, R>(_ f: @escaping (A1) -> R) -> (A1?) -> R? { | |
return { (a1: A1?) -> R? in | |
guard let a1 = a1 else { return nil } | |
return f(a1) | |
} | |
} | |
postfix func ¿<A1, A2, R>(_ f: @escaping (A1, A2) -> R) -> (A1?, A2?) -> R? { | |
return { (a1: A1?, a2: A2?) -> R? in | |
guard let a1 = a1 else { return nil } | |
guard let a2 = a2 else { return nil } | |
return f(a1, a2) | |
} | |
} | |
postfix func ¿<A1, A2, A3, R>(_ f: @escaping (A1, A2, A3) -> R) -> (A1?, A2?, A3?) -> R? { | |
return { (a1: A1?, a2: A2?, a3: A3?) -> R? in | |
guard let a1 = a1 else { return nil } | |
guard let a2 = a2 else { return nil } | |
guard let a3 = a3 else { return nil } | |
return f(a1, a2, a3) | |
} | |
} | |
postfix func ¿<A1, A2, A3, A4, R>(_ f: @escaping (A1, A2, A3, A4) -> R) -> (A1?, A2?, A3?, A4?) -> R? { | |
return { (a1: A1?, a2: A2?, a3: A3?, a4: A4?) -> R? in | |
guard let a1 = a1 else { return nil } | |
guard let a2 = a2 else { return nil } | |
guard let a3 = a3 else { return nil } | |
guard let a4 = a4 else { return nil } | |
return f(a1, a2, a3, a4) | |
} | |
} | |
postfix func ¿<A1, A2, A3, A4, A5, R>(_ f: @escaping (A1, A2, A3, A4, A5) -> R) -> (A1?, A2?, A3?, A4?, A5?) -> R? { | |
return { (a1: A1?, a2: A2?, a3: A3?, a4: A4?, a5: A5?) -> R? in | |
guard let a1 = a1 else { return nil } | |
guard let a2 = a2 else { return nil } | |
guard let a3 = a3 else { return nil } | |
guard let a4 = a4 else { return nil } | |
guard let a5 = a5 else { return nil } | |
return f(a1, a2, a3, a4, a5) | |
} | |
} | |
postfix func ¿<A1, A2, A3, A4, A5, A6, R>(_ f: @escaping (A1, A2, A3, A4, A5, A6) -> R) -> (A1?, A2?, A3?, A4?, A5?, A6?) -> R? { | |
return { (a1: A1?, a2: A2?, a3: A3?, a4: A4?, a5: A5?, a6: A6?) -> R? in | |
guard let a1 = a1 else { return nil } | |
guard let a2 = a2 else { return nil } | |
guard let a3 = a3 else { return nil } | |
guard let a4 = a4 else { return nil } | |
guard let a5 = a5 else { return nil } | |
guard let a6 = a6 else { return nil } | |
return f(a1, a2, a3, a4, a5, a6) | |
} | |
} | |
postfix func ¿<A1, A2, A3, A4, A5, A6, A7, R>(_ f: @escaping (A1, A2, A3, A4, A5, A6, A7) -> R) -> (A1?, A2?, A3?, A4?, A5?, A6?, A7?) -> R? { | |
return { (a1: A1?, a2: A2?, a3: A3?, a4: A4?, a5: A5?, a6: A6?, a7: A7?) -> R? in | |
guard let a1 = a1 else { return nil } | |
guard let a2 = a2 else { return nil } | |
guard let a3 = a3 else { return nil } | |
guard let a4 = a4 else { return nil } | |
guard let a5 = a5 else { return nil } | |
guard let a6 = a6 else { return nil } | |
guard let a7 = a7 else { return nil } | |
return f(a1, a2, a3, a4, a5, a6, a7) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment