import AOC

aoc 2021, 2 do
  def input_stream(),
    do:
      super()
      |> Stream.map(fn
        "forward " <> v -> {:forward, String.to_integer(v)}
        "down " <> v -> {:down, String.to_integer(v)}
        "up " <> v -> {:up, String.to_integer(v)}
      end)

  def p1 do
    input_stream()
    |> Enum.reduce({0, 0}, fn
      {:forward, v}, {h, d} -> {h + v, d}
      {:down, v}, {h, d} -> {h, d + v}
      {:up, v}, {h, d} -> {h, d - v}
    end)
    |> then(fn {h, d} -> h * d end)
  end

  def p2 do
    input_stream()
    |> Enum.reduce({0, 0, 0}, fn
      {:forward, v}, {h, d, a} -> {h + v, d + a * v, a}
      {:down, v}, {h, d, a} -> {h, d, a + v}
      {:up, v}, {h, d, a} -> {h, d, a - v}
    end)
    |> then(fn {h, d, _v} -> h * d end)
  end
end