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)))) }