Last active
January 20, 2019 01:47
-
-
Save LucianoPAlmeida/7ca366bbed30b92aa4afeead9442af18 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
// | |
// 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