import fp from "lodash/fp.js";
import u from "updeep";

const update = (action, value) =>
    action === "down" ? u({ aim: fp.add(value) })
   : action === "up"  ? u({ aim: fp.add(-value) })
   : u((state) =>
       u({ x: fp.add(value), depth: fp.add(value * state.aim) }, state)
     );

export function solution(lines) {
    const { x, depth } = lines.reduce(
        (accum, line) => update(...line)(accum),
        { depth: 0, aim: 0, x: 0 }
    );

    return x * depth;
}