package nova.monadic_sfx.util.reactive.store import monix.eval.Task import monix.catnap.ConcurrentQueue import monix.reactive.Observer trait Sink[A, -B] { def offer(inst: A, b: B): Task[Unit] } object Sink { implicit def sinkForCq[B] = new Sink[ConcurrentQueue[Task, B], B] { override def offer(queue: ConcurrentQueue[Task, B], b: B): Task[Unit] = queue.offer(b) } implicit def sinkForObserver[B] = new Sink[Observer[B], B] { override def offer(inst: Observer[B], b: B): Task[Unit] = Task.deferFuture(inst.onNext(b)).void } implicit def sinkForStore[B, C] = new Sink[Store[B, C], B] { override def offer(inst: Store[B, C], b: B): Task[Unit] = Task.deferFuture(inst.onNext(b)).void } // implicitly[Sink[Store[Int, Int], Int]] } trait Sink2[-B] { def offer(b: B): monix.bio.Task[Unit] } object Sink2 { def concurrentQueue[B](queue: ConcurrentQueue[monix.bio.Task, B]): Sink2[B] = new Sink2[B] { def offer(b: B): monix.bio.Task[Unit] = queue.offer(b) } }