aboutsummaryrefslogtreecommitdiff
path: root/aoc-2020-gleam/src/util/dir.gleam
diff options
context:
space:
mode:
Diffstat (limited to 'aoc-2020-gleam/src/util/dir.gleam')
-rw-r--r--aoc-2020-gleam/src/util/dir.gleam41
1 files changed, 41 insertions, 0 deletions
diff --git a/aoc-2020-gleam/src/util/dir.gleam b/aoc-2020-gleam/src/util/dir.gleam
new file mode 100644
index 0000000..6f637d9
--- /dev/null
+++ b/aoc-2020-gleam/src/util/dir.gleam
@@ -0,0 +1,41 @@
+import gleam/int
+import gleam/iterator as iter
+import ext/resultx as resx
+import ext/iteratorx as iterx
+import util/pos.{Pos}
+
+pub type Dir {
+ North
+ East
+ South
+ West
+}
+
+pub fn offset(direction: Dir) -> Pos {
+ case direction {
+ North -> #(0, 1)
+ East -> #(1, 0)
+ South -> #(0, -1)
+ West -> #(-1, 0)
+ }
+}
+
+pub fn degree_to_turn(degree: Int) -> Int {
+ resx.assert_unwrap(int.modulo(degree / 90, by: 4))
+}
+
+fn rotate_clockwise_once(direction: Dir) -> Dir {
+ case direction {
+ North -> East
+ East -> South
+ South -> West
+ West -> North
+ }
+}
+
+pub fn rotate_clockwise(this direction: Dir, by times: Int) -> Dir {
+ direction
+ |> iterx.unfold_infinitely(with: rotate_clockwise_once)
+ |> iter.at(times)
+ |> resx.assert_unwrap
+}