From 413891726756aed407a2cfbceb4cf0e14bbcc982 Mon Sep 17 00:00:00 2001 From: "H.J" Date: Mon, 17 Jun 2024 15:10:31 -0400 Subject: gleam 2017 day 14 complete --- aoc2017-gleam/src/helpers/state.gleam | 55 +++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 aoc2017-gleam/src/helpers/state.gleam (limited to 'aoc2017-gleam/src/helpers') diff --git a/aoc2017-gleam/src/helpers/state.gleam b/aoc2017-gleam/src/helpers/state.gleam new file mode 100644 index 0000000..cbbad81 --- /dev/null +++ b/aoc2017-gleam/src/helpers/state.gleam @@ -0,0 +1,55 @@ +import gleam/erlang/process.{type Subject, Normal} +import gleam/option.{None} +import gleam/otp/actor.{type Next, Continue, Stop} +import gleam/set.{type Set} + +const timeout = 1000 + +pub type Message(k) { + Shutdown + Check(key: k, client: Subject(Bool)) + Add(key: k) + Drop(key: k) + Pop(client: Subject(Result(k, Nil))) +} + +fn handle_message(message: Message(k), set: Set(k)) -> Next(Message(k), Set(k)) { + case message { + Shutdown -> Stop(Normal) + Check(key, client) -> { + process.send(client, set.contains(set, key)) + Continue(set, None) + } + Add(key) -> Continue(set.insert(set, key), None) + Drop(key) -> Continue(set.delete(set, key), None) + Pop(client) -> { + case set.to_list(set) { + [next, ..] -> { + process.send(client, Ok(next)) + Continue(set.delete(set, next), None) + } + [] -> { + process.send(client, Error(Nil)) + Stop(Normal) + } + } + } + } +} + +pub fn start_actor(with: Set(a)) { + let assert Ok(actor) = actor.start(with, handle_message) + actor +} + +pub fn pop(actor) { + process.call(actor, Pop, timeout) +} + +pub fn check(actor, value) { + process.call(actor, Check(value, _), timeout) +} + +pub fn drop(actor, value) { + process.send(actor, Drop(value)) +} -- cgit v1.2.3