You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
37 lines
990 B
37 lines
990 B
package nova.monadic_sfx.implicits
|
|
|
|
import monix.reactive.Observable
|
|
import monix.reactive.Observer
|
|
import monix.{eval => me}
|
|
import monix.execution.Scheduler
|
|
|
|
class ActionObservableExecuter[T](
|
|
delegate: Observable[T]
|
|
) {
|
|
def -->(sub: Observer[T])(implicit s: Scheduler) =
|
|
delegate
|
|
.doOnNext(el => me.Task(sub.onNext(el)))
|
|
.subscribe()
|
|
|
|
}
|
|
class ActionObservableBuilder[A](
|
|
observableAction: Observable[A]
|
|
) {
|
|
def useLazy[T](v: => T) =
|
|
new ActionObservableExecuter[T](observableAction.mapEval(_ => me.Task(v)))
|
|
|
|
def use[T](cb: A => T) =
|
|
new ActionObservableExecuter[T](
|
|
observableAction.mapEval(ae => me.Task(cb(ae)))
|
|
)
|
|
|
|
def useIterable[T](cb: A => collection.immutable.Iterable[T]) =
|
|
new ActionObservableExecuter[T](
|
|
observableAction.flatMap(a =>
|
|
Observable.suspend(Observable.fromIterable(cb(a)))
|
|
)
|
|
)
|
|
|
|
def map[B](cb: A => B) =
|
|
new ActionObservableBuilder(observableAction.mapEval(v => me.Task(cb(v))))
|
|
}
|