module Template_12(Stack, push, pop, isEmpty, size, empty,
  compile, runProgram, Expr(..), eval, Instr(..),
  merge, mNumbers, mNum) where

import Stack(Stack, push, pop, isEmpty, size, empty)

-- DO NOT CHANGE ANYTHING ABOVE THIS LINE

-- Exercise 1
merge :: (Ord a) => [a] -> [a] -> [a]
merge = undefined

mNumbers :: [Integer]
mNumbers = undefined

mNum :: Int -> Integer
mNum = undefined


-- Exercise 2.2 and 2.3

data Expr = Var String | Num Integer | Minus Expr Expr | Times Expr Expr deriving Show

eval a (Num n) = n
eval a (Var x) = a x
eval a (Minus e1 e2) = eval a e1 - eval a e2
eval a (Times e1 e2) = eval a e1 * eval a e2

data Instr = Const Integer | Load String | Subtract | Multiply deriving Show

type Program = [Instr]

runProgram :: (String -> Integer) -> [Instr] -> Integer
runProgram = undefined 
   
compile :: Expr -> Program
compile = undefined