-
-runAll :: ProgrammedMachine
-runAll = do m0 <- get
- unless (lkup (_ip m0) (_memory m0) == 99)
- do runStep
- runAll
-
-runStep :: ProgrammedMachine
-runStep =
- do m0 <- get
- let mem = _memory m0
- let ip = _ip m0
- let (mem', ip') = perform (mem!ip) ip mem
- put m0 {_ip = ip', _memory = mem'}
-
-perform :: Int -> Int -> Memory -> (Memory, Int)
-perform 1 ip mem = (iInsert (ip + 3) (a + b) mem, ip + 4)
- where a = mem!>(ip + 1)
- b = mem!>(ip + 2)
-perform 2 ip mem = (iInsert (ip + 3) (a * b) mem, ip + 4)
- where a = mem!>(ip + 1)
- b = mem!>(ip + 2)
-
-
--- Some IntMap utility functions, for syntactic sugar
-
--- prefix version of (!)
-lkup k m = m!k
-
--- indirect lookup
-(!>) m k = m!(m!k)
-
--- indirect insert
-iInsert k v m = M.insert (m!k) v m
-
-
-
--- Parse the input file
-type Parser = Parsec Void Text
-
-sc :: Parser ()
-sc = L.space (skipSome spaceChar) CA.empty CA.empty
--- sc = L.space (skipSome (char ' ')) CA.empty CA.empty
-
-lexeme = L.lexeme sc
-integer = lexeme L.decimal
--- signedInteger = L.signed sc integer
-symb = L.symbol sc
-comma = symb ","
-
-memoryP = integer `sepBy` comma
-
-successfulParse :: Text -> [Int]
-successfulParse input =
- case parse memoryP "input" input of
- Left _err -> [] -- TIO.putStr $ T.pack $ parseErrorPretty err
- Right memory -> memory
\ No newline at end of file