1 module Value(Value(..), Op1(..), Op2(..), uno, duo) where
    2 
    3 data Value
    4   = Num Integer
    5   | Log Bool
    6   | Wrong
    7   deriving (Eq, Show)
    8 
    9 data Op1
   10   = Not
   11   | Minus
   12   deriving (Eq, Show)
   13 
   14 data Op2
   15   = And
   16   | Or
   17   | Mul
   18   | Add
   19   | Sub
   20   | Div
   21   | Mod
   22   | Less
   23   | LessEq
   24   | Eq
   25   deriving (Eq, Enum, Bounded, Show)
   26 
   27 uno :: Op1 -> Value -> Value
   28 uno Not   (Log b) = Log (not b)
   29 uno Minus (Num n) = Num (negate n)
   30 uno _     _       = Wrong
   31 
   32 duo :: Op2 -> Value -> Value -> Value
   33 duo And     (Log a) (Log b)          = Log (a && b)
   34 duo Or      (Log a) (Log b)          = Log (a || b)
   35 duo Eq      (Log a) (Log b)          = Log (a == b)
   36 duo Mul     (Num m) (Num n)          = Num (m * n)
   37 duo Add     (Num m) (Num n)          = Num (m + n)
   38 duo Sub     (Num m) (Num n)          = Num (m - n)
   39 duo Div     (Num m) (Num n) | n /= 0 = Num (m `div` n)
   40 duo Mod     (Num m) (Num n) | n /= 0 = Num (m `mod` n)
   41 duo Less    (Num m) (Num n)          = Log (m < n)
   42 duo LessEq  (Num m) (Num n)          = Log (m <= n)
   43 duo Eq      (Num m) (Num n)          = Log (m == n)
   44 duo _       _       _                = Wrong