Advertisement
Guest User

Untitled

a guest
Aug 23rd, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.04 KB | None | 0 0
  1. public struct CycleIterator <Base: Sequence>: IteratorProtocol {
  2. public typealias Element = Base.Element
  3.  
  4. private var sequence: Base
  5. private var iterator: Base.Iterator
  6.  
  7. internal init (_ sequence: Base) {
  8. self.sequence = sequence
  9. self.iterator = self.sequence.makeIterator()
  10. }
  11.  
  12. public mutating func next () -> Element? {
  13. var next = self.iterator.next()
  14.  
  15. if next == nil {
  16. self.iterator = self.sequence.makeIterator()
  17. next = self.iterator.next()
  18. }
  19.  
  20. return next
  21. }
  22. }
  23.  
  24. public struct LazyCycleSequence <Base: LazySequenceProtocol>: LazySequenceProtocol {
  25. public typealias Iterator = CycleIterator<Base>
  26. public typealias Element = Iterator.Element
  27.  
  28. private let base: Base
  29.  
  30. internal init (_ base: Base) {
  31. self.base = base
  32. }
  33.  
  34. public func makeIterator () -> Iterator {
  35. return Iterator(self.base)
  36. }
  37. }
  38.  
  39. public extension LazySequenceProtocol {
  40. func cycle () -> LazyCycleSequence<Self> {
  41. return LazyCycleSequence(self)
  42. }
  43. }
  44.  
  45. print(type(of: [1, 2, 3].lazy.cycle().prefix(5))) // AnySequence<Int>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement