Skip to content

Instantly share code, notes, and snippets.

@LucianoPAlmeida
Last active January 20, 2019 01:47
Show Gist options
  • Save LucianoPAlmeida/7ca366bbed30b92aa4afeead9442af18 to your computer and use it in GitHub Desktop.
Save LucianoPAlmeida/7ca366bbed30b92aa4afeead9442af18 to your computer and use it in GitHub Desktop.
//
// main.swift
// InterspesedSequence
//
// Created by Luciano Almeida on 19/01/19.
// Copyright © 2019 Luciano Almeida. All rights reserved.
//
/// A lazy view for sequence that creates a new sequece where for each iteration of the base sequence the value is inserted.
struct InterspersedSequence<Base: Sequence> {
var base: Base
var value: Element
struct Iterator {
var _base: Base.Iterator
var _value: InterspersedSequence.Element
private var _intersperse: Bool = false
private var _nextValue: Element?
init(_base: Base.Iterator, _value: InterspersedSequence.Element) {
self._base = _base
self._value = _value
self._nextValue = self._base.next()
}
}
}
extension InterspersedSequence.Iterator: IteratorProtocol {
typealias Element = InterspersedSequence<Base>.Element
mutating func next() -> Element? {
defer { _intersperse.toggle() }
if _intersperse && _nextValue != nil {
return _value
} else {
defer { _nextValue = _base.next() }
return _nextValue
}
}
}
extension InterspersedSequence: Sequence {
typealias Element = Base.Element
func makeIterator() -> InterspersedSequence<Base>.Iterator {
return InterspersedSequence.Iterator(_base: base.makeIterator(), _value: value)
}
}
extension Sequence {
func interspersed(with value: Element) -> InterspersedSequence<Self> {
return InterspersedSequence(base: self, value: value)
}
}
let r = [1, 2, 3].interspersed(with: 4).map { $0 }
print(r) // [1, 4, 2, 4, 3]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment