aboutsummaryrefslogtreecommitdiff
path: root/aoc2023/build/packages/gleam_otp/src/gleam@otp@intensity_tracker.erl
diff options
context:
space:
mode:
authorJ.J <thechairman@thechairman.info>2024-05-30 21:50:02 -0400
committerJ.J <thechairman@thechairman.info>2024-05-30 21:50:02 -0400
commit612fd986ab1e00b6d34dc1937136250e08e89325 (patch)
treea3c93952040c6afdf348b5831619a45db7ba0a2e /aoc2023/build/packages/gleam_otp/src/gleam@otp@intensity_tracker.erl
parent231c2b688d1e6cf0846d46e883da30e042a9c6cf (diff)
downloadgleam_aoc-612fd986ab1e00b6d34dc1937136250e08e89325.tar.gz
gleam_aoc-612fd986ab1e00b6d34dc1937136250e08e89325.zip
cleanup
Diffstat (limited to 'aoc2023/build/packages/gleam_otp/src/gleam@otp@intensity_tracker.erl')
-rw-r--r--aoc2023/build/packages/gleam_otp/src/gleam@otp@intensity_tracker.erl53
1 files changed, 53 insertions, 0 deletions
diff --git a/aoc2023/build/packages/gleam_otp/src/gleam@otp@intensity_tracker.erl b/aoc2023/build/packages/gleam_otp/src/gleam@otp@intensity_tracker.erl
new file mode 100644
index 0000000..8792f14
--- /dev/null
+++ b/aoc2023/build/packages/gleam_otp/src/gleam@otp@intensity_tracker.erl
@@ -0,0 +1,53 @@
+-module(gleam@otp@intensity_tracker).
+-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function]).
+
+-export([new/2, trim_window/3, add_event/1]).
+-export_type([intensity_tracker/0, too_intense/0]).
+
+-opaque intensity_tracker() :: {intensity_tracker,
+ integer(),
+ integer(),
+ list(integer())}.
+
+-type too_intense() :: too_intense.
+
+-spec new(integer(), integer()) -> intensity_tracker().
+new(Limit, Period) ->
+ {intensity_tracker, Limit, Period, []}.
+
+-spec now_seconds() -> integer().
+now_seconds() ->
+ erlang:monotonic_time(1).
+
+-spec trim_window(list(integer()), integer(), integer()) -> list(integer()).
+trim_window(Events, Now, Period) ->
+ case Events of
+ [] ->
+ [];
+
+ [Event | Events@1] ->
+ case Now >= (Event + Period) of
+ true ->
+ [Event | trim_window(Events@1, Now, Period)];
+
+ false ->
+ []
+ end
+ end.
+
+-spec add_event(intensity_tracker()) -> {ok, intensity_tracker()} |
+ {error, too_intense()}.
+add_event(Tracker) ->
+ Now = now_seconds(),
+ Events = trim_window(
+ [Now | erlang:element(4, Tracker)],
+ Now,
+ erlang:element(3, Tracker)
+ ),
+ case gleam@list:length(Events) >= erlang:element(2, Tracker) of
+ true ->
+ {error, too_intense};
+
+ false ->
+ {ok, erlang:setelement(4, Tracker, Events)}
+ end.