module Demo where

{- 
The definitions of `StateT`, `ExceptT` and `Identity` come from separate modules
in the `mtl` library.
-}

import Data.Function ((&))
import Control.Monad.Identity 
    ( Identity(runIdentity) )
import Control.Monad.State
    ( StateT(runStateT), MonadState(put, get) )
import Control.Monad.Except
    ( ExceptT, MonadError(throwError), runExceptT )

import ParserLib (Parser)
import qualified ParserLib as P
import Data.Char (isAlpha)

import Control.Applicative

-- Simple language of expressions. Constants, Variables (for State), and Division (for errors)
data Expr
  = Val Int
  | Var Char
  | Add Expr Expr
  | Div Expr Expr
  deriving (Show)

ok :: Expr
ok = Div (Val 84) (Add (Val 1) (Val 1))

fine :: Expr
fine = Div (Val 84) (Add (Val 1) (Var 'x'))

err :: Expr
err = Div (Var 'x') (Val 0)

-- Parse (wsP, stringP, parens, name, int, bop, exp)
-- Eval Bad
-- Eval Maybe
-- Eval Either
-- Eval State
-- StateT