Slide 45
Slide 45 text
RxJava Operator
class ObservableFilter(
private val source: ObservableSource,
private val predicate: (T) -> Boolean
) : Observable(), HasUpstreamObservableSource {
override fun source(): ObservableSource = source
override fun subscribeActual(observer: Observer) {
source.subscribe(FilterObserver(observer, predicate))
}
internal class FilterObserver(
actual: Observer,
private val filter: (T) -> Boolean
) : BasicFuseableObserver(actual) {
override fun onNext(t: T) {
if (sourceMode == QueueFuseable.NONE) {
try {
if (filter(t)) downstream.onNext(t)
} catch (e: Throwable) {
fail(e)
}
} else {
downstream.onNext(null)
}
}
override fun requestFusion(mode: Int) = transitiveBoundaryFusion(mode)
override fun poll(): T? {
while (true) {
val v = qd.poll()
if (v == null || filter(v)) return v
}
}
}
}
fun Observable.filter(
predicate: (T) -> Boolean
): Observable = ObservableFilter(this, predicate)