|
|
@ -1,6 +1,7 @@
|
|
|
|
package eu.kanade.tachiyomi.ui.base.presenter
|
|
|
|
package eu.kanade.tachiyomi.ui.base.presenter
|
|
|
|
|
|
|
|
|
|
|
|
import nucleus.presenter.RxPresenter
|
|
|
|
import nucleus.presenter.RxPresenter
|
|
|
|
|
|
|
|
import nucleus.presenter.delivery.Delivery
|
|
|
|
import rx.Observable
|
|
|
|
import rx.Observable
|
|
|
|
|
|
|
|
|
|
|
|
open class BasePresenter<V> : RxPresenter<V>() {
|
|
|
|
open class BasePresenter<V> : RxPresenter<V>() {
|
|
|
@ -35,4 +36,29 @@ open class BasePresenter<V> : RxPresenter<V>() {
|
|
|
|
fun <T> Observable<T>.subscribeReplay(onNext: (V, T) -> Unit, onError: ((V, Throwable) -> Unit)? = null)
|
|
|
|
fun <T> Observable<T>.subscribeReplay(onNext: (V, T) -> Unit, onError: ((V, Throwable) -> Unit)? = null)
|
|
|
|
= compose(deliverReplay<T>()).subscribe(split(onNext, onError)).apply { add(this) }
|
|
|
|
= compose(deliverReplay<T>()).subscribe(split(onNext, onError)).apply { add(this) }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Subscribes an observable with [DeliverWithView] and adds it to the presenter's lifecycle
|
|
|
|
|
|
|
|
* subscription list.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param onNext function to execute when the observable emits an item.
|
|
|
|
|
|
|
|
* @param onError function to execute when the observable throws an error.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
fun <T> Observable<T>.subscribeWithView(onNext: (V, T) -> Unit, onError: ((V, Throwable) -> Unit)? = null)
|
|
|
|
|
|
|
|
= compose(DeliverWithView<V, T>(view())).subscribe(split(onNext, onError)).apply { add(this) }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* A deliverable that only emits to the view if attached, otherwise the event is ignored.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
class DeliverWithView<View, T>(private val view: Observable<View>) : Observable.Transformer<T, Delivery<View, T>> {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun call(observable: Observable<T>): Observable<Delivery<View, T>> {
|
|
|
|
|
|
|
|
return observable
|
|
|
|
|
|
|
|
.materialize()
|
|
|
|
|
|
|
|
.filter { notification -> !notification.isOnCompleted }
|
|
|
|
|
|
|
|
.flatMap { notification ->
|
|
|
|
|
|
|
|
view.take(1).filter { it != null }.map { Delivery(it, notification) }
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|