Guest User

Untitled

a guest
Jun 18th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.95 KB | None | 0 0
  1. public func zip <Sequence1: Sequence, Sequence2: Sequence> (_ sequence1: Sequence1, _ sequence2: Sequence2) ->
  2. AnySequence<(Sequence1.Element, Sequence2.Element)> {
  3. return AnySequence { () -> AnyIterator<(Sequence1.Element, Sequence2.Element)> in
  4. var iterator1 = sequence1.makeIterator()
  5. var iterator2 = sequence2.makeIterator()
  6. var reachedEnd = false
  7.  
  8. return AnyIterator { () -> (Sequence1.Element, Sequence2.Element)? in
  9. if reachedEnd {
  10. return nil
  11. }
  12.  
  13. guard let element1 = iterator1.next(), let element2 = iterator2.next() else {
  14. reachedEnd.toggle()
  15.  
  16. return nil
  17. }
  18.  
  19. return (element1, element2)
  20. }
  21. }
  22. }
  23.  
  24. public func zipLongest <Sequence1: Sequence, Sequence2: Sequence> (_ sequence1: Sequence1, _ sequence2: Sequence2) ->
  25. AnySequence<(Sequence1.Element?, Sequence2.Element?)> {
  26. return AnySequence { () -> AnyIterator<(Sequence1.Element?, Sequence2.Element?)> in
  27. var iterator1 = sequence1.makeIterator()
  28. var iterator2 = sequence2.makeIterator()
  29. var reachedEnd = false
  30.  
  31. return AnyIterator { () -> (Sequence1.Element?, Sequence2.Element?)? in
  32. if reachedEnd {
  33. return nil
  34. }
  35.  
  36. let element1 = iterator1.next()
  37. let element2 = iterator2.next()
  38.  
  39. if element1 == nil && element2 == nil {
  40. reachedEnd.toggle()
  41.  
  42. return nil
  43. }
  44.  
  45. return (element1, element2)
  46. }
  47. }
  48. }
  49.  
  50. public func unzip <Sequence1: Sequence, Type1, Type2> (_ sequence: Sequence1) -> ([Type1], [Type2]) where
  51. Sequence1.Element == (Type1, Type2) {
  52. return sequence.reduce(into: ([Type1](), [Type2]())) {
  53. $0.0.append($1.0)
  54. $0.1.append($1.1)
  55. }
  56. }
  57.  
  58. public typealias Zip2Sequence<Sequence1, Sequence2> = AnySequence<(Sequence1.Element, Sequence2.Element)> where
  59. Sequence1: Sequence, Sequence2: Sequence
  60. public typealias Zip2Iterator<Sequence1, Sequence2> = AnySequence<(Sequence1.Element, Sequence2.Element)>.Iterator
  61. where Sequence1: Sequence, Sequence2: Sequence
Add Comment
Please, Sign In to add comment