Skip to content

Instantly share code, notes, and snippets.

@natecook1000
Last active April 21, 2018 18:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save natecook1000/5277d94d8f2291324a32df3f29fd146f to your computer and use it in GitHub Desktop.
Save natecook1000/5277d94d8f2291324a32df3f29fd146f to your computer and use it in GitHub Desktop.
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