package nova.monadic_sfx.actors import scala.concurrent.duration._ import akka.actor.typed._ import akka.util.Timeout import cats.effect.Resource import io.odin.Logger import monix.bio.Task trait ActorModule { implicit def timeout: Timeout = Timeout(3.seconds) def actorSystemResource( logger: Logger[Task] ): Resource[Task, ActorSystem[SpawnProtocol.Command]] = Resource.make(logger.info("Creating Actor System") >> Task { ActorSystem(SpawnProtocol(), name = "FXActorSystem") })(sys => for { _ <- Task(sys.terminate()) _ <- Task.fromFuture(sys.whenTerminated) _ <- logger.info("Actor System Terminated") } yield () ) }