Skip to content

Instantly share code, notes, and snippets.

@DylanLukes
Created July 19, 2018 21:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DylanLukes/748fee181de67ad38b5596137bf4b095 to your computer and use it in GitHub Desktop.
Save DylanLukes/748fee181de67ad38b5596137bf4b095 to your computer and use it in GitHub Desktop.
//
// 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