Skip to content

Instantly share code, notes, and snippets.

@natecook1000
Created February 16, 2018 23:17
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 natecook1000/091067ba20f1d0a12ff83617ae57d404 to your computer and use it in GitHub Desktop.
Save natecook1000/091067ba20f1d0a12ff83617ae57d404 to your computer and use it in GitHub Desktop.
public struct PeekingIterator<T : IteratorProtocol> : IteratorProtocol {
fileprivate var _iterator: T
public fileprivate(set) var buffered: T.Element?
public init(_ iterator: T) {
self._iterator = iterator
self.buffered = _iterator.next()
}
public init<U: Sequence>(_ sequence: U) where U.Iterator == T {
self.init(sequence.makeIterator())
}
public mutating func next() -> T.Element? {
defer { buffered = _iterator.next() }
return buffered
}
}
let a = 1...10
var p = PeekingIterator(a)
p.buffered // 1
p.next() // 1
p.next() // 2
p.next() // 3
p.buffered // 4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment