package nova.monadic_sfx.actors import akka.actor.typed._ import akka.actor.typed.scaladsl._ object Counter { sealed trait Command case object Increment extends Command final case class GetValue(replyTo: ActorRef[Value]) extends Command final case class Value(n: Int) final case object Stop extends Command def apply(): Behavior[Command] = { Behaviors.setup(context => new Counter(context)) } } class Counter(context: ActorContext[Counter.Command]) extends AbstractBehavior[Counter.Command](context) { import Counter._ private var n = 0 override def onMessage(msg: Command): Behavior[Counter.Command] = { msg match { case Increment => n += 1 context.log.debug("Incremented counter to [{}]", n) this case GetValue(replyTo) => replyTo ! Value(n) this case Stop => context.log.info("Recieved shutdown counter actor") Behaviors.stopped } } override def onSignal: PartialFunction[Signal, Behavior[Counter.Command]] = { case _: Terminated => context.log.info("Recieved shutdown counter actor terminated") this case PostStop => context.log.info("Recieved shutdown counter actor poststop") this } }