I have been using Apple\'s native zip(_:_:) recently and I ran into a situation whereby I needed
You need all the functions but you don't need multiple ZipSequence types.
@inlinable public func zip(
_ sequence0: Sequence0, _ sequence1: Sequence1, _ sequence2: Sequence2
) -> AnySequence<(Sequence0.Element, Sequence1.Element, Sequence2.Element)> {
.init(
sequence(
state: (
sequence0.makeIterator(), sequence1.makeIterator(), sequence2.makeIterator()
)
) {
.init(
($0.0.next(), $0.1.next(), $0.2.next())
)
}
)
}
@inlinable public func zip<
Sequence0: Sequence, Sequence1: Sequence, Sequence2: Sequence, Sequence3: Sequence
>(
_ sequence0: Sequence0, _ sequence1: Sequence1, _ sequence2: Sequence2, _ sequence3: Sequence3
) -> AnySequence<(Sequence0.Element, Sequence1.Element, Sequence2.Element, Sequence3.Element)> {
.init(
sequence(
state: (
sequence0.makeIterator(), sequence1.makeIterator(), sequence2.makeIterator(), sequence3.makeIterator()
)
) {
.init(
($0.0.next(), $0.1.next(), $0.2.next(), $0.3.next())
)
}
)
}
public extension Optional {
/// Exchange three optionals for a single optional tuple.
/// - Returns: `nil` if any tuple element is `nil`.
init(_ optionals: (Wrapped0?, Wrapped1?, Wrapped2?))
where Wrapped == (Wrapped0, Wrapped1, Wrapped2) {
switch optionals {
case let (wrapped0?, wrapped1?, wrapped2?):
self = (wrapped0, wrapped1, wrapped2)
default:
self = nil
}
}
/// Exchange four optionals for a single optional tuple.
/// - Returns: `nil` if any tuple element is `nil`.
init(_ optionals: (Wrapped0?, Wrapped1?, Wrapped2?, Wrapped3?))
where Wrapped == (Wrapped0, Wrapped1, Wrapped2, Wrapped3) {
switch optionals {
case let (wrapped0?, wrapped1?, wrapped2?, wrapped3?):
self = (wrapped0, wrapped1, wrapped2, wrapped3)
default:
self = nil
}
}
}