From 32bc75cae2a0fceafea5c48c550888bc1d7c6016 Mon Sep 17 00:00:00 2001 From: "H.J" Date: Mon, 17 Jun 2024 15:39:21 -0400 Subject: gleam 2017 day 14 --- aoc2017-gleam/src/helpers/set_state.gleam | 55 +++++++++++++++++++++++++++++++ aoc2017-gleam/src/helpers/state.gleam | 55 ------------------------------- 2 files changed, 55 insertions(+), 55 deletions(-) create mode 100644 aoc2017-gleam/src/helpers/set_state.gleam delete mode 100644 aoc2017-gleam/src/helpers/state.gleam (limited to 'aoc2017-gleam/src/helpers') diff --git a/aoc2017-gleam/src/helpers/set_state.gleam b/aoc2017-gleam/src/helpers/set_state.gleam new file mode 100644 index 0000000..cbbad81 --- /dev/null +++ b/aoc2017-gleam/src/helpers/set_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)) +} diff --git a/aoc2017-gleam/src/helpers/state.gleam b/aoc2017-gleam/src/helpers/state.gleam deleted file mode 100644 index cbbad81..0000000 --- a/aoc2017-gleam/src/helpers/state.gleam +++ /dev/null @@ -1,55 +0,0 @@ -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