Skip to content

Instantly share code, notes, and snippets.

@oisdk
Created November 20, 2015 00:46
Show Gist options
  • Save oisdk/07d36de759f7e539bc54 to your computer and use it in GitHub Desktop.
Save oisdk/07d36de759f7e539bc54 to your computer and use it in GitHub Desktop.
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