Created
April 15, 2018 06:19
-
-
Save libsteve/805c3aad09d3c3ccf43bb008103b0e60 to your computer and use it in GitHub Desktop.
An implementation of zip that combines the elements of three sequences.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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