Zip3 in Swift
- struct Zip3SequenceIterator<Sequence1: Sequence, Sequence2: Sequence, Sequence3: Sequence>: IteratorProtocol {
- private var iterator1: Sequence1.Iterator
- private var iterator2: Sequence2.Iterator
- private var iterator3: Sequence3.Iterator
- init(_ sequence1: Sequence1, _ sequence2: Sequence2, _ sequence3: Sequence3) {
- self.iterator1 = sequence1.makeIterator()
- self.iterator2 = sequence2.makeIterator()
- self.iterator3 = sequence3.makeIterator()
- }
- mutating func next() -> (Sequence1.Element, Sequence2.Element, Sequence3.Element)? {
- iterator1.next().flatMap { e1 in
- iterator2.next().flatMap { e2 in
- iterator3.next().map { e3 in
- (e1, e2, e3)
- }
- }
- }
- }
- }
- struct Zip3Sequence<Sequence1: Sequence, Sequence2: Sequence, Sequence3: Sequence>: Sequence {
- private let sequence1: Sequence1
- private let sequence2: Sequence2
- private let sequence3: Sequence3
- func makeIterator() -> Zip3SequenceIterator<Sequence1, Sequence2, Sequence3> {
- .init(sequence1, sequence2, sequence3)
- }
- init(_ s1: Sequence1, _ s2: Sequence2, _ s3: Sequence3) {
- sequence1 = s1
- sequence2 = s2
- sequence3 = s3
- }
- }
- func zip3<S1, S2, S3>(_ s1: S1, _ s2: S2, _ s3: S3) -> Zip3Sequence<S1, S2, S3> {
- .init(s1, s2, s3)
- }