module Vm where import Control.Monad.Trans.State as St data Instr = Noop | Addx Integer data CpuState = CS {regx :: Integer, step :: Integer} initState = CS 1 0 eval :: Instr -> St.State CpuState () eval Noop = do s <- St.get put $ s {step = step s + 1} eval (Addx i) = do s <- St.get let step' = step s + 2 let x' = regx s + i put $ CS x' step' instrFromWords :: [String] -> Instr instrFromWords ["noop"] = Noop instrFromWords ["addx", i] = Addx (read i) readProgram :: IO [Instr] readProgram = do x <- lines <$> getContents pure $ map (instrFromWords . words) x