Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public func zip <Sequence1: Sequence, Sequence2: Sequence> (_ sequence1: Sequence1, _ sequence2: Sequence2) ->
- AnySequence<(Sequence1.Element, Sequence2.Element)> {
- return AnySequence { () -> AnyIterator<(Sequence1.Element, Sequence2.Element)> in
- var iterator1 = sequence1.makeIterator()
- var iterator2 = sequence2.makeIterator()
- var reachedEnd = false
- return AnyIterator { () -> (Sequence1.Element, Sequence2.Element)? in
- if reachedEnd {
- return nil
- }
- guard let element1 = iterator1.next(), let element2 = iterator2.next() else {
- reachedEnd.toggle()
- return nil
- }
- return (element1, element2)
- }
- }
- }
- public func zipLongest <Sequence1: Sequence, Sequence2: Sequence> (_ sequence1: Sequence1, _ sequence2: Sequence2) ->
- AnySequence<(Sequence1.Element?, Sequence2.Element?)> {
- return AnySequence { () -> AnyIterator<(Sequence1.Element?, Sequence2.Element?)> in
- var iterator1 = sequence1.makeIterator()
- var iterator2 = sequence2.makeIterator()
- var reachedEnd = false
- return AnyIterator { () -> (Sequence1.Element?, Sequence2.Element?)? in
- if reachedEnd {
- return nil
- }
- let element1 = iterator1.next()
- let element2 = iterator2.next()
- if element1 == nil && element2 == nil {
- reachedEnd.toggle()
- return nil
- }
- return (element1, element2)
- }
- }
- }
- public func unzip <Sequence1: Sequence, Type1, Type2> (_ sequence: Sequence1) -> ([Type1], [Type2]) where
- Sequence1.Element == (Type1, Type2) {
- return sequence.reduce(into: ([Type1](), [Type2]())) {
- $0.0.append($1.0)
- $0.1.append($1.1)
- }
- }
- public typealias Zip2Sequence<Sequence1, Sequence2> = AnySequence<(Sequence1.Element, Sequence2.Element)> where
- Sequence1: Sequence, Sequence2: Sequence
- public typealias Zip2Iterator<Sequence1, Sequence2> = AnySequence<(Sequence1.Element, Sequence2.Element)>.Iterator
- where Sequence1: Sequence, Sequence2: Sequence
Add Comment
Please, Sign In to add comment