Skip to content

Instantly share code, notes, and snippets.

@blinker13
Last active May 2, 2016 10:30
Show Gist options
  • Save blinker13/f844f96880bca2f207e0fea0bab7b004 to your computer and use it in GitHub Desktop.
Save blinker13/f844f96880bca2f207e0fea0bab7b004 to your computer and use it in GitHub Desktop.
internal struct DirectionalSequence<Elements : CollectionType where Elements.Index : Strideable> {
private let elements:Elements
private var reversed:Bool
// MARK: -
internal init(_ elements:Elements, reversed:Bool) {
(self.elements, self.reversed) = (elements, reversed)
}
}
// MARK: -
extension DirectionalSequence {
private var distance:Elements.Index.Stride { return reversed ? -1 : 1 }
private var startIndex:Elements.Index { return reversed ? elements.endIndex - 1 : elements.startIndex }
private var endIndex:Elements.Index { return reversed ? elements.startIndex - 1 : elements.endIndex }
private var stride:StrideTo<Elements.Index> { return startIndex.stride(to:endIndex, by:distance) }
}
// MARK: -
extension DirectionalSequence : SequenceType {
func generate() -> DirectionalIterator<Elements> {
return DirectionalIterator(elements, stride)
}
}
internal struct DirectionalIterator<Elements : CollectionType where Elements.Index : Strideable> {
private let elements:Elements
private var iterator:StrideToGenerator<Elements.Index>
// MARK: -
private init(_ elements:Elements, _ stride:StrideTo<Elements.Index>) {
self.iterator = stride.generate()
self.elements = elements
}
}
// MARK: -
extension DirectionalIterator : GeneratorType {
mutating func next() -> Elements.Generator.Element? {
guard let index = iterator.next() else { return nil }
return elements[index]
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment