Improves data locality for `Map` and `Filter`.

This commit is contained in:
Krunoslav Zaher 2015-11-15 21:24:45 +01:00
parent b3a66aa45f
commit 69d34d58c4
2 changed files with 21 additions and 17 deletions

View File

@ -9,14 +9,15 @@
import Foundation
class FilterSink<O : ObserverType>: Sink<O>, ObserverType {
typealias Predicate = (Element) throws -> Bool
typealias Element = O.E
typealias Parent = Filter<Element>
private let _parent: Parent
private let _predicate: Predicate
init(parent: Parent, observer: O) {
_parent = parent
init(predicate: Predicate, observer: O) {
_predicate = predicate
super.init(observer: observer)
}
@ -24,7 +25,7 @@ class FilterSink<O : ObserverType>: Sink<O>, ObserverType {
switch event {
case .Next(let value):
do {
let satisfies = try _parent._predicate(value)
let satisfies = try _predicate(value)
if satisfies {
forwardOn(.Next(value))
}
@ -52,7 +53,7 @@ class Filter<Element> : Producer<Element> {
}
override func run<O: ObserverType where O.E == Element>(observer: O) -> Disposable {
let sink = FilterSink(parent: self, observer: observer)
let sink = FilterSink(predicate: _predicate, observer: observer)
sink.disposable = _source.subscribe(sink)
return sink
}

View File

@ -9,14 +9,15 @@
import Foundation
class MapSink<SourceType, O : ObserverType> : Sink<O>, ObserverType {
typealias Selector = (SourceType) throws -> ResultType
typealias ResultType = O.E
typealias Element = SourceType
typealias Parent = Map<SourceType, ResultType>
private let _selector: Selector
private let _parent: Parent
init(parent: Parent, observer: O) {
_parent = parent
init(selector: Selector, observer: O) {
_selector = selector
super.init(observer: observer)
}
@ -24,7 +25,7 @@ class MapSink<SourceType, O : ObserverType> : Sink<O>, ObserverType {
switch event {
case .Next(let element):
do {
let mappedElement = try _parent._selector(element)
let mappedElement = try _selector(element)
forwardOn(.Next(mappedElement))
}
catch let e {
@ -42,16 +43,18 @@ class MapSink<SourceType, O : ObserverType> : Sink<O>, ObserverType {
}
class MapWithIndexSink<SourceType, O : ObserverType> : Sink<O>, ObserverType {
typealias Selector = (SourceType, Int) throws -> ResultType
typealias ResultType = O.E
typealias Element = SourceType
typealias Parent = MapWithIndex<SourceType, ResultType>
private let _parent: Parent
private let _selector: Selector
private var _index = 0
init(parent: Parent, observer: O) {
_parent = parent
init(selector: Selector, observer: O) {
_selector = selector
super.init(observer: observer)
}
@ -59,7 +62,7 @@ class MapWithIndexSink<SourceType, O : ObserverType> : Sink<O>, ObserverType {
switch event {
case .Next(let element):
do {
let mappedElement = try _parent._selector(element, try incrementChecked(&_index))
let mappedElement = try _selector(element, try incrementChecked(&_index))
forwardOn(.Next(mappedElement))
}
catch let e {
@ -89,7 +92,7 @@ class MapWithIndex<SourceType, ResultType> : Producer<ResultType> {
}
override func run<O: ObserverType where O.E == ResultType>(observer: O) -> Disposable {
let sink = MapWithIndexSink(parent: self, observer: observer)
let sink = MapWithIndexSink(selector: _selector, observer: observer)
sink.disposable = _source.subscribe(sink)
return sink
}
@ -124,7 +127,7 @@ class Map<SourceType, ResultType>: Producer<ResultType> {
}
override func run<O: ObserverType where O.E == ResultType>(observer: O) -> Disposable {
let sink = MapSink(parent: self, observer: observer)
let sink = MapSink(selector: _selector, observer: observer)
sink.disposable = _source.subscribe(sink)
return sink
}