Last active
April 21, 2018 18:58
-
-
Save natecook1000/5277d94d8f2291324a32df3f29fd146f to your computer and use it in GitHub Desktop.
This file contains 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
extension Sequence { | |
func interspersed(with element: Element) -> [Element] { | |
var result: [Element] = [] | |
var iterator = makeIterator() | |
if let first = iterator.next() { | |
result.append(first) | |
} | |
while let elementFromSelf = iterator.next() { | |
result.append(element) | |
result.append(elementFromSelf) | |
} | |
return result | |
} | |
func interspersed<S: Sequence>(with elements: S) -> [Element] | |
where S.Element == Element | |
{ | |
var result: [Element] = [] | |
var iterator = makeIterator() | |
// Could optimize to only create this array if needed | |
let interstitial = Array(elements) | |
if let first = iterator.next() { | |
result.append(first) | |
} | |
while let elementFromSelf = iterator.next() { | |
result.append(contentsOf: interstitial) | |
result.append(elementFromSelf) | |
} | |
return result | |
} | |
func alternating<S: Sequence>(with elements: S) -> [Element] | |
where S.Element == Element | |
{ | |
return zip(self, elements).reduce(into: []) { result, pair in | |
result.append(pair.0) | |
result.append(pair.1) | |
} | |
} | |
} | |
let numbers = [1, 2, 3, 4, 5] | |
numbers.interspersed(with: 0) // [1, 0, 2, 0, 3, 0, 4, 0, 5] | |
numbers.interspersed(with: [10, 20]) // [1, 10, 20, 2, 10, 20, 3, 10, 20, 4, 10, 20, 5] | |
numbers.alternating(with: 100...200) // [1, 100, 2, 101, 3, 102, 4, 103, 5, 104] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment