Created
November 20, 2015 00:46
-
-
Save oisdk/07d36de759f7e539bc54 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
protocol _AnyTuple : CustomStringConvertible { var tDesc: String { get } } | |
struct EmptyTuple: _AnyTuple { | |
var description: String { return "()" } | |
var tDesc: String { return ")" } | |
} | |
struct NonEmptyTuple<Element, Tail : _AnyTuple> { var (first, tail): (Element, Tail) } | |
extension NonEmptyTuple : Tuple, _AnyTuple { | |
var description: String { return "(" + String(reflecting: first) + tail.tDesc } | |
var tDesc: String { return ", " + String(reflecting: first) + tail.tDesc } | |
} | |
infix operator | { associativity right precedence 90 } | |
func |<E, T:_AnyTuple>(lhs: E, rhs: T) -> NonEmptyTuple<E, T> { | |
return NonEmptyTuple(first: lhs, tail: rhs) | |
} | |
func |<E, T>(lhs: E, rhs: T) -> NonEmptyTuple<E, NonEmptyTuple<T, EmptyTuple>> { | |
return NonEmptyTuple(first: lhs, tail: NonEmptyTuple(first: rhs, tail: EmptyTuple())) | |
} | |
protocol Tuple : _AnyTuple { | |
typealias First | |
typealias Tail : _AnyTuple | |
var first : First { get } | |
var tail : Tail { get } | |
} | |
extension Tuple where Tail : Tuple { | |
typealias Second = Tail.First | |
var second: Tail.First { return self.tail.first } | |
} | |
extension Tuple where Tail : Tuple, Tail.Tail : Tuple { | |
typealias Third = Tail.Second | |
var third: Third { return self.tail.second } | |
} | |
extension Tuple where Tail : Tuple, Tail.Tail : Tuple, Tail.Tail.Tail : Tuple { | |
typealias Fourth = Tail.Third | |
var fourth: Fourth { return self.tail.third } | |
} | |
let triple = (1 | 2.0 | "A") | |
let quadle = (1 | 2.0 | "A" | [1, 2]) | |
triple.first | |
triple.second | |
triple.third | |
// triple.fourth | |
quadle.fourth |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment