[swift-evolution] Passing an optional first argument to sequence(first:next:)

Dave Abrahams dabrahams at apple.com
Thu Sep 1 17:49:37 CDT 2016


on Mon Aug 29 2016, Tim Vermeulen <swift-evolution at swift.org> wrote:

> The intent of my function wasn’t very clear, but it was supposed to
> return a sequence that contains *all* consecutive pairs, i.e. (0 ..<
> 4).pairs would result in [(0, 1), (1, 2), (2, 3)].

extension Sequence {
  typealias Element = Iterator.Element
  
  /// All adjacent pairs of elements, in order.
  var allAdjacentPairs: UnfoldSequence<(Element, Element), (i: Iterator, e: Element?)> {
    var i = makeIterator()
    let e = i.next()
    
    return sequence(state: (i, e)) {
      (s: inout (i: Iterator, e: Element?))->(Element, Element)? in
      let e = s.i.next()
      defer { s.e = e }
      return e.map { (s.e!, $0) }
    }
  }
}

for j in 0..<10 {
  print(Array((0..<j).allAdjacentPairs))
}

HTH,

-- 
-Dave



More information about the swift-evolution mailing list