complex-generic-0.1.1: Data/Complex/Generic.hs
{-# LANGUAGE DeriveDataTypeable, TemplateHaskell, MultiParamTypeClasses, FlexibleInstances #-}
{- |
Module : Data.Complex.Generic
Copyright : (c) Claude Heiland-Allen 2012
License : BSD3
Maintainer : claude@mathr.co.uk
Stability : unstable
Portability : DeriveDataTypeable, TemplateHaskell, MultiParamTypeClasses, FlexibleInstances
Complex numbers.
-}
module Data.Complex.Generic
( module Data.Complex.Generic.Class
, Complex((:+))
, toDataComplex
, fromDataComplex
) where
import Data.Data (Data)
import Data.Typeable (Typeable)
import Foreign.C (CFloat, CDouble)
import Data.Int
import Data.Word
import Data.Fixed
import Data.Ratio
import qualified Data.Complex as X
import Data.Complex.Generic.Class
import Data.Complex.Generic.Default
import Data.Complex.Generic.TH
-- | Complex numbers in rectangular form.
data Complex a = !a :+ !a
deriving (Eq, Show, Read, Data, Typeable)
infix 6 :+
-- | Convert to 'Data.Complex.Complex'.
toDataComplex :: Complex r -> X.Complex r
toDataComplex (x :+ y) = x X.:+ y
-- | Convert from 'Data.Complex.Complex'.
fromDataComplex :: X.Complex r -> Complex r
fromDataComplex (x X.:+ y) = x :+ y
instance Functor Complex where
fmap f (x :+ y) = f x :+ f y
mk :: a -> a -> Complex a
{- needed because of this bug(?) in TemplateHaskell
Illegal variable name: `:+'
When splicing a TH declaration
-}
mk = (:+)
toPair :: Complex a -> (a, a)
toPair (x :+ y) = (x, y)
deriveComplexRF ''Complex ''Float 'mk 'toPair
deriveComplexRF ''Complex ''Double 'mk 'toPair
deriveComplexRF ''Complex ''CFloat 'mk 'toPair
deriveComplexRF ''Complex ''CDouble 'mk 'toPair
deriveComplexN ''Complex ''Integer 'mk 'toPair
deriveComplexN ''Complex ''Int 'mk 'toPair
deriveComplexN ''Complex ''Int8 'mk 'toPair
deriveComplexN ''Complex ''Int16 'mk 'toPair
deriveComplexN ''Complex ''Int32 'mk 'toPair
deriveComplexN ''Complex ''Int64 'mk 'toPair
deriveComplexN ''Complex ''Word 'mk 'toPair
deriveComplexN ''Complex ''Word8 'mk 'toPair
deriveComplexN ''Complex ''Word16 'mk 'toPair
deriveComplexN ''Complex ''Word32 'mk 'toPair
deriveComplexN ''Complex ''Word64 'mk 'toPair
{-
deriveComplex1F ''Complex ''HasResolution ''Fixed 'mk 'toPair
deriveComplex1F ''Complex ''Integral ''Ratio 'mk 'toPair
-}
instance HasResolution t => ComplexRect (Complex (Fixed t)) (Fixed t) where
mkRect = (:+)
rect (x :+ y) = (x, y)
real = realDefault
imag = imagDefault
realPart = realPartDefault
imagPart = imagPartDefault
conjugate = conjugateDefault
magnitudeSquared = magnitudeSquaredDefault
sqr = sqrDefault
(.*) = rmulDefault
(*.) = mulrDefault
instance HasResolution t => Num (Complex (Fixed t)) where
(+) = addDefault
(-) = subDefault
(*) = mulDefault
negate = negateDefault
fromInteger = fromIntegerDefault
abs = error $ "Num.abs: not implementable for Complex Fixed"
signum = error $ "Num.signum: not implementable for Complex Fixed"
instance HasResolution t => Fractional (Complex (Fixed t)) where
(/) = divDefault
fromRational = fromRationalDefault
instance Integral t => ComplexRect (Complex (Ratio t)) (Ratio t) where
mkRect = (:+)
rect (x :+ y) = (x, y)
real = realDefault
imag = imagDefault
realPart = realPartDefault
imagPart = imagPartDefault
conjugate = conjugateDefault
magnitudeSquared = magnitudeSquaredDefault
sqr = sqrDefault
(.*) = rmulDefault
(*.) = mulrDefault
instance Integral t => Num (Complex (Ratio t)) where
(+) = addDefault
(-) = subDefault
(*) = mulDefault
negate = negateDefault
fromInteger = fromIntegerDefault
abs = error $ "Num.abs: not implementable for Complex Ratio"
signum = error $ "Num.signum: not implementable for Complex Ratio"
instance Integral t => Fractional (Complex (Ratio t)) where
(/) = divDefault
fromRational = fromRationalDefault