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

  1. package nova.monadic_sfx.util.reactive.store
  2. import monix.eval.Task
  3. import monix.catnap.ConcurrentQueue
  4. import monix.reactive.Observer
  5. trait Sink[A, -B] {
  6. def offer(inst: A, b: B): Task[Unit]
  7. }
  8. object Sink {
  9. implicit def sinkForCq[B] =
  10. new Sink[ConcurrentQueue[Task, B], B] {
  11. override def offer(queue: ConcurrentQueue[Task, B], b: B): Task[Unit] =
  12. queue.offer(b)
  13. }
  14. implicit def sinkForObserver[B] =
  15. new Sink[Observer[B], B] {
  16. override def offer(inst: Observer[B], b: B): Task[Unit] =
  17. Task.deferFuture(inst.onNext(b)).void
  18. }
  19. implicit def sinkForStore[B, C] =
  20. new Sink[Store[B, C], B] {
  21. override def offer(inst: Store[B, C], b: B): Task[Unit] =
  22. Task.deferFuture(inst.onNext(b)).void
  23. }
  24. // implicitly[Sink[Store[Int, Int], Int]]
  25. }
  26. trait Sink2[-B] {
  27. def offer(b: B): monix.bio.Task[Unit]
  28. }
  29. object Sink2 {
  30. def concurrentQueue[B](queue: ConcurrentQueue[monix.bio.Task, B]): Sink2[B] =
  31. new Sink2[B] {
  32. def offer(b: B): monix.bio.Task[Unit] = queue.offer(b)
  33. }
  34. }