Created
          October 22, 2017 00:02 
        
      - 
      
- 
        Save airspeedswift/83fb25d01e0c790b78d59d597245e263 to your computer and use it in GitHub Desktop. 
    De-C++ified Rerverse
  
        
  
    
      This file contains hidden or 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
    
  
  
    
  | 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