Last active
March 22, 2018 13:11
-
-
Save khanlou/fd68aded2224e906ff3430d1cb832c36 to your computer and use it in GitHub Desktop.
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 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