package nova.monadic_sfx.concurrent import com.typesafe.scalalogging.Logger import monix.execution.Scheduler import monix.execution.UncaughtExceptionReporter import monix.execution.schedulers.TracingScheduler import cats.effect.Blocker final case class Schedulers( io: Schedulers.IoScheduler, async: Schedulers.AsyncScheduler, fx: Schedulers.FxScheduler ) object Schedulers { val reporter = UncaughtExceptionReporter { ex => val logger = Logger[Schedulers] logger.error("Uncaught exception", ex) } val default = Schedulers( IoScheduler( Scheduler .io() .withUncaughtExceptionReporter(Schedulers.reporter) ), AsyncScheduler( Scheduler .computation() .withUncaughtExceptionReporter(Schedulers.reporter) ), FxScheduler( TracingScheduler( JFXExecutionContexts.fxScheduler .withUncaughtExceptionReporter(Schedulers.reporter) ) ) ) final case class AsyncScheduler(value: Scheduler) final case class IoScheduler(value: Scheduler) { val blocker = Blocker.liftExecutionContext(value) } final case class FxScheduler(value: Scheduler) }