29 lines
607 B
Haskell
29 lines
607 B
Haskell
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
|
|
|