package nova.monadic_sfx.actors import io.odin.Logger import monix.eval.Task import cats.effect.Resource import akka.actor.typed.scaladsl.Behaviors import com.softwaremill.macwire._ import akka.util.Timeout import scala.concurrent.duration._ import scala.concurrent.Future import akka.actor.typed._ import akka.actor.typed.scaladsl.AskPattern._ import scala.concurrent.Await import nova.monadic_sfx.executors.Schedulers trait ActorModule { import scala.concurrent.ExecutionContext implicit val timeout: Timeout = Timeout(3.seconds) def actorSystemResource( logger: Logger[Task] ): Resource[Task, ActorSystem[SpawnProtocol.Command]] = Resource.make(logger.info("Creating Actor System") >> Task { ActorSystem(HelloWorldMain(), name = "FXActorSystem") })(sys => logger.info("Shutting down actor system") >> Task( sys.terminate() ) >> logger.info("Actor System terminated") ) // def actorsResource( // system: ActorSystem[SpawnProtocol.Command], // logger: Logger[Task], // schedulers: Schedulers // ): Resource[Task, Task[ActorRef[Counter.Command]]] = { // implicit val ec: ExecutionContext = system.executionContext // implicit val scheduler = system.scheduler // Resource.make( // Task { // val actor = Task.deferFuture { // system.ask[ActorRef[Counter.Command]]( // SpawnProtocol.Spawn( // behavior = Counter(), // name = "counterActor", // // DispatcherSelector.fromConfig("javafx-dispatcher"), // // Props.empty, // _ // ) // ) // } // // system. // actor // } // )(actorTask => // for { // actor <- actorTask // _ <- logger.info("Stopping actor counter") // t <- Task(actor ! Counter.Stop) // _ <- logger.info("Counter actor stopped") // } yield () // ) // } } object HelloWorldMain { def apply(): Behavior[SpawnProtocol.Command] = Behaviors.setup { context => // Start initial tasks // context.spawn(...) SpawnProtocol() } }