Skip to content

Instantly share code, notes, and snippets.

@khanlou
Last active March 22, 2018 13:11
Show Gist options
  • Save khanlou/fd68aded2224e906ff3430d1cb832c36 to your computer and use it in GitHub Desktop.
Save khanlou/fd68aded2224e906ff3430d1cb832c36 to your computer and use it in GitHub Desktop.
struct CyclicSequence<Base: Sequence>: Sequence {
let base: Base
init(base: Base) {
self.base = base
}
func makeIterator() -> CyclicIterator<Base> {
return CyclicIterator(base: base)
}
}
struct CyclicIterator<Base: Sequence>: IteratorProtocol {
let base: Base
var currentIterator: Base.Iterator
init(base: Base) {
self.base = base
self.currentIterator = base.makeIterator()
}
mutating func next() -> Base.Element? {
if let next = currentIterator.next() {
return next
}
currentIterator = base.makeIterator()
return currentIterator.next()
}
}
extension Sequence {
func cycle() -> CyclicSequence<Self> {
return CyclicSequence(base: self)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment