module Numeric.Special.Trigonometric (csc,   sec,   cot,
				      acsc,  asec,  acot,
				      csch,  sech,  coth,
				      acsch, asech, acoth
				     ) where

import Data.Complex

-- Circular functions

csc :: Floating a => a -> a
csc :: forall a. Floating a => a -> a
csc a
z = a
1 forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a -> a
sin a
z

sec :: Floating a => a -> a
sec :: forall a. Floating a => a -> a
sec a
z = a
1 forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a -> a
cos a
z

cot :: Floating a => a -> a
cot :: forall a. Floating a => a -> a
cot a
z = a
1 forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a -> a
tan a
z

-- Inverse circular functions

acsc :: Floating a => a -> a
acsc :: forall a. Floating a => a -> a
acsc a
z = forall a. Floating a => a -> a
asin forall a b. (a -> b) -> a -> b
$ a
1 forall a. Fractional a => a -> a -> a
/ a
z

asec :: Floating a => a -> a
asec :: forall a. Floating a => a -> a
asec a
z = forall a. Floating a => a -> a
acos forall a b. (a -> b) -> a -> b
$ a
1 forall a. Fractional a => a -> a -> a
/ a
z

acot :: Floating a => a -> a
acot :: forall a. Floating a => a -> a
acot a
z = forall a. Floating a => a -> a
atan forall a b. (a -> b) -> a -> b
$ a
1 forall a. Fractional a => a -> a -> a
/ a
z

-- Hyperbolic functions

csch :: Floating a => a -> a
csch :: forall a. Floating a => a -> a
csch a
z = a
1 forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a -> a
sinh a
z

sech :: Floating a => a -> a
sech :: forall a. Floating a => a -> a
sech a
z = a
1 forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a -> a
cosh a
z

coth :: Floating a => a -> a
coth :: forall a. Floating a => a -> a
coth a
z = a
1 forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a -> a
tanh a
z

-- Inverse hyperbolic functions

acsch :: Floating a => a -> a
acsch :: forall a. Floating a => a -> a
acsch a
z = forall a. Floating a => a -> a
asinh forall a b. (a -> b) -> a -> b
$ a
1 forall a. Fractional a => a -> a -> a
/ a
z

asech :: Floating a => a -> a
asech :: forall a. Floating a => a -> a
asech a
z = forall a. Floating a => a -> a
acosh forall a b. (a -> b) -> a -> b
$ a
1 forall a. Fractional a => a -> a -> a
/ a
z

acoth :: Floating a => a -> a
acoth :: forall a. Floating a => a -> a
acoth a
z = forall a. Floating a => a -> a
atanh forall a b. (a -> b) -> a -> b
$ a
1 forall a. Fractional a => a -> a -> a
/ a
z

-- Specialization pragmas

{-# specialize csc :: Double         -> Double         #-}
{-# specialize csc :: Complex Double -> Complex Double #-}
{-# specialize sec :: Double         -> Double         #-}
{-# specialize sec :: Complex Double -> Complex Double #-}
{-# specialize cot :: Double         -> Double         #-}
{-# specialize cot :: Complex Double -> Complex Double #-}

{-# specialize acsc :: Double         -> Double         #-}
{-# specialize acsc :: Complex Double -> Complex Double #-}
{-# specialize asec :: Double         -> Double         #-}
{-# specialize asec :: Complex Double -> Complex Double #-}
{-# specialize acot :: Double         -> Double         #-}
{-# specialize acot :: Complex Double -> Complex Double #-}

{-# specialize csch :: Double         -> Double         #-}
{-# specialize csch :: Complex Double -> Complex Double #-}
{-# specialize sech :: Double         -> Double         #-}
{-# specialize sech :: Complex Double -> Complex Double #-}
{-# specialize coth :: Double         -> Double         #-}
{-# specialize coth :: Complex Double -> Complex Double #-}

{-# specialize acsch :: Double         -> Double         #-}
{-# specialize acsch :: Complex Double -> Complex Double #-}
{-# specialize asech :: Double         -> Double         #-}
{-# specialize asech :: Complex Double -> Complex Double #-}
{-# specialize acoth :: Double         -> Double         #-}
{-# specialize acoth :: Complex Double -> Complex Double #-}