1 module Value(Value(..), Op1(..), Op2(..), uno, duo) where
    2 
    3 data Value
    4   = Num Integer
    5   | Bol 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 | Or
   16   | Mul | Add | Sub | Div | Mod
   17   | Less | LessEq | Eq
   18   deriving (Eq, Enum, Bounded, Show)
   19 
   20 uno :: Op1 -> Value -> Value
   21 uno Not   (Bol b) = Bol (not b)
   22 uno Minus (Num n) = Num (negate n)
   23 uno _     _       = Wrong
   24 
   25 duo :: Op2 -> Value -> Value -> Value
   26 duo And     (Bol a) (Bol b)          = Bol (a && b)
   27 duo Or      (Bol a) (Bol b)          = Bol (a || b)
   28 duo Eq      (Bol a) (Bol b)          = Bol (a == b)
   29 duo Mul     (Num m) (Num n)          = Num (m * n)
   30 duo Add     (Num m) (Num n)          = Num (m + n)
   31 duo Sub     (Num m) (Num n)          = Num (m - n)
   32 duo Div     (Num m) (Num n) | n /= 0 = Num (m `div` n)
   33 duo Mod     (Num m) (Num n) | n /= 0 = Num (m `mod` n)
   34 duo Less    (Num m) (Num n)          = Bol (m < n)
   35 duo LessEq  (Num m) (Num n)          = Bol (m <= n)
   36 duo Eq      (Num m) (Num n)          = Bol (m == n)
   37 duo _       _       _                = Wrong