{-#LANGUAGE TemplateHaskell#-}
{-#LANGUAGE QuasiQuotes#-}

module Algebra.CAS.Type where

import Language.Haskell.TH

data Value =
   V Name
 | C Rational
 | CI Integer
 | Neg Value
 | Value :^: Value
 | Value :*: Value
 | Value :+: Value
 | Value :-: Value
 | Value :/: Value
 | Sin Value
 | Cos Value
 | Tan Value
 | Sinh Value
 | Cosh Value
 | Tanh Value
 | Asin Value
 | Acos Value
 | Atan Value
 | Asinh Value
 | Acosh Value
 | Atanh Value
 | Exp Value
 | Log Value
 | Abs Value
 | Sig Value
 | LogBase Value Value
 | Pi
 | Sqrt Value
 | Diff Value Value
 | Other Exp
 deriving (Show,Eq)

instance Num Value where
  fromInteger a = CI (fromIntegral a)
  (+) a b = a :+: b
  (-) a b = a :-: b
  (*) a b = a :*: b
  abs a = Abs a
  signum a = Sig a

instance Fractional Value where
  fromRational a = C (fromRational a)
  recip a = (C 1.0) :/: a
  (/) a b = a :/: b

instance Floating Value where
  pi = Pi
  exp = Exp
  sqrt = Sqrt
  log = Log
  (**) = (:^:)
  logBase = LogBase
  sin = Sin
  tan = Tan
  cos = Cos
  asin = Asin
  atan = Atan
  acos = Acos
  sinh = Sinh
  tanh = Tanh
  cosh = Cosh
  asinh = Asinh
  atanh = Atanh
  acosh = Acosh

val :: String -> Value
val v = V (mkName v)