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.
49 lines
1.0 KiB
49 lines
1.0 KiB
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)
|
|
}
|
|
}
|