Skip to content

Instantly share code, notes, and snippets.

@Kondenko
Created October 15, 2019 18:30
Show Gist options
  • Save Kondenko/d3bb35dbd77a3566ea1f097c74894e79 to your computer and use it in GitHub Desktop.
Save Kondenko/d3bb35dbd77a3566ea1f097c74894e79 to your computer and use it in GitHub Desktop.
package com.kondenko.pocketwaka.utils
import io.reactivex.Observable
import io.reactivex.ObservableOperator
import io.reactivex.Observer
import io.reactivex.disposables.Disposable
fun <T, R> Observable<T>.scanMap(initialValue: T? = null, scanMap: (T, T) -> R): Observable<R> =
lift(ScanMap(initialValue, scanMap))
class ScanMap<T, R>(private val initialValue: T? = null, private val scanMap: (T, T) -> R) : ObservableOperator<R, T> {
override fun apply(observer: Observer<in R>): Observer<in T> = ActualObserver(observer)
private inner class ActualObserver(private val observer: Observer<in R>) : Observer<T> {
private var previousValue: T? = initialValue
override fun onNext(next: T) {
previousValue?.let { prev -> observer.onNext(scanMap(prev, next)) }
previousValue = next
}
override fun onComplete() = observer.onComplete()
override fun onSubscribe(d: Disposable) = observer.onSubscribe(d)
override fun onError(e: Throwable) = observer.onError(e)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment