aboutsummaryrefslogtreecommitdiff
path: root/aoc-2020-gleam/src/util/pos4.gleam
blob: a96bcca1efe0daf330375b0f1e85a3f70e9431fb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import gleam/list
import gleam/bool
import gleam/set.{type Set}

pub type Pos4 =
  #(Int, Int, Int, Int)

pub const zero = #(0, 0, 0, 0)

fn directions80() -> Set(Pos4) {
  set.from_list({
    use x <- list.flat_map(over: [-1, 0, 1])
    use y <- list.flat_map(over: [-1, 0, 1])
    use z <- list.flat_map(over: [-1, 0, 1])
    use w <- list.flat_map(over: [-1, 0, 1])
    let pos = #(x, y, z, w)
    use <- bool.guard(when: pos == zero, return: [])
    [pos]
  })
}

pub fn add(p1: Pos4, p2: Pos4) -> Pos4 {
  #(p1.0 + p2.0, p1.1 + p2.1, p1.2 + p2.2, p1.3 + p2.3)
}

pub fn neighbours80(p: Pos4) -> Set(Pos4) {
  directions80()
  |> set.to_list
  |> list.map(with: add(p, _))
  |> set.from_list
}