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

module Algebra.CAS.Algorithm.Integrate where

import Algebra.CAS.Type
import Algebra.CAS.Core
import Algebra.CAS.Algorithm.Simplify


integrate :: Value -> Value -> Value
integrate (x :+: y) z = (integrate x z) + (integrate y z)
integrate (a@(CI _) :*: y) z = a * integrate y z
integrate (a@(C _) :*: y) z = a * integrate y z
integrate (CI a) z = (CI a) * z
integrate (C a) z = (C a) * z
integrate (Sin x') y' | x' == y' = Cos x'
                      | otherwise = error "can not parse"
integrate (Cos x') y' | x' == y' = -1 * Sin x'
                      | otherwise = error "can not parse"
integrate (x :^: CI 2) y | x == y    = x ** 3 / 3
                         | otherwise = error "can not parse"
integrate (x :^: CI n) y | x == y    = (x :^: (CI (n+1))) / (fromIntegral (n+1))
                         | otherwise = error "can not parse"

integrate a b = error $ "can not parse : " ++ show a ++ " ##  " ++ show b