package main

import "actor"
import "core:fmt"

MaxMessages :: 10_000_000

Command :: enum {
	Inc,
}

stop_behaviour :: proc(
	self: ^actor.Actor,
	sys: ^actor.System,
	state: ^actor.State,
	from: actor.ActorRef,
	msg: any,
) {
	fmt.println("stopping")
	actor.stop(sys)
}

counting_behaviour :: proc(
	self: ^actor.Actor,
	sys: ^actor.System,
	state: ^actor.State,
	from: actor.ActorRef,
	msg: any,
) {
	switch d in msg {
	case Command:
		data := state^.(u128)
		switch d {
		case .Inc:
			data += 1
		}
		state^ = data
		if data >= MaxMessages {
			actor.become(self, stop_behaviour)
		}
		actor.send(sys, self.ref, from, Command.Inc)
	case u128:
		if d >= MaxMessages {
			actor.become(self, stop_behaviour)
		}
		actor.send(sys, self.ref, from, d + 1)
	case string:
		fmt.println(d)
	}
}

main :: proc() {
	sys := actor.new_system()
	count := actor.spawn(sys, u128(0), counting_behaviour)

	actor.send(sys, count, count, Command.Inc)

	actor.work(sys)

	actor.destroy_system(sys)
}