Skip to content

Instantly share code, notes, and snippets.

@airspeedswift
Created October 22, 2017 00:02
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 airspeedswift/83fb25d01e0c790b78d59d597245e263 to your computer and use it in GitHub Desktop.
Save airspeedswift/83fb25d01e0c790b78d59d597245e263 to your computer and use it in GitHub Desktop.
De-C++ified Rerverse
struct MyReversed<Base: BidirectionalCollection> {
let base: Base
}
extension MyReversed: Collection {
public enum Index: Comparable {
case element(Base.Index)
case end
public static func < (lhs: Index, rhs: Index) -> Bool {
switch (lhs,rhs) {
case let (.element(i),.element(j)):
return j < i
case (.end,.end), (.element,.end):
return true
case (.end,.element):
return false
}
}
public var baseIndex: Base.Index {
guard case let .element(i) = self
else { fatalError("Can't get equivalent of endIndex") }
return i
}
}
public var startIndex: Index { return .element(base.index(before: base.endIndex)) }
public var endIndex: Index { return .end }
public func index(after: Index) -> Index {
switch after {
case .end:
fatalError("Can't advance beyond endIndex")
case let .element(i) where i == base.startIndex:
return .end
case let .element(i):
return .element(base.index(before: i))
}
}
public typealias Element = Base.Element
public subscript(i: Index) -> Element {
return base[i.baseIndex]
}
}
extension BidirectionalCollection {
func myReversed() -> MyReversed<Self> {
return MyReversed(base: self)
}
}
let s = "find the last space"
let i = s.myReversed().index(of: " ")!
print("-->" + s[..<i.baseIndex] + "<--")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment