Skip to content

Instantly share code, notes, and snippets.

@stevebrun
Created April 15, 2018 06:19
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 stevebrun/805c3aad09d3c3ccf43bb008103b0e60 to your computer and use it in GitHub Desktop.
Save stevebrun/805c3aad09d3c3ccf43bb008103b0e60 to your computer and use it in GitHub Desktop.
An implementation of zip that combines the elements of three sequences.
import Foundation
struct Zip3Sequence<Sequence1, Sequence2, Sequence3>: Sequence
where Sequence1: Sequence, Sequence2: Sequence, Sequence3: Sequence {
typealias Element = Iterator.Element
typealias Iterator = Zip3Iterator<Sequence1.Iterator, Sequence2.Iterator, Sequence3.Iterator>
private var s1: Sequence1
private var s2: Sequence2
private var s3: Sequence3
init(_ s1: Sequence1, _ s2: Sequence2, _ s3: Sequence3) {
self.s1 = s1
self.s2 = s2
self.s3 = s3
}
func makeIterator() -> Iterator {
return Zip3Iterator(s1.makeIterator(), s2.makeIterator(), s3.makeIterator())
}
}
struct Zip3Iterator<Iterator1, Iterator2, Iterator3>: IteratorProtocol
where Iterator1: IteratorProtocol, Iterator2: IteratorProtocol, Iterator3: IteratorProtocol {
typealias Element = (Iterator1.Element, Iterator2.Element, Iterator3.Element)
private var i1: Iterator1
private var i2: Iterator2
private var i3: Iterator3
init(_ i1: Iterator1, _ i2: Iterator2, _ i3: Iterator3) {
self.i1 = i1
self.i2 = i2
self.i3 = i3
}
mutating func next() -> Element? {
guard let v1 = i1.next(),
let v2 = i2.next(),
let v3 = i3.next() else { return nil }
return (v1, v2, v3)
}
}
func zip3<Sequence1, Sequence2, Sequence3>(_ s1: Sequence1, _ s2: Sequence2, _ s3: Sequence3)
-> Zip3Sequence<Sequence1, Sequence2, Sequence3>
where Sequence1: Sequence, Sequence2: Sequence, Sequence3: Sequence {
return Zip3Sequence(s1, s2, s3)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment