|
@@ -1,6 +1,7 @@
|
|
|
package eu.kanade.tachiyomi.ui.base.presenter
|
|
|
|
|
|
import nucleus.presenter.RxPresenter
|
|
|
+import nucleus.presenter.delivery.Delivery
|
|
|
import rx.Observable
|
|
|
|
|
|
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)
|
|
|
= 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) }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|