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
data Complex a = !a :+ !a
deriving (Eq, Show, Read, Data, Typeable)
infix 6 :+
toDataComplex :: Complex r -> X.Complex r
toDataComplex (x :+ y) = x X.:+ y
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
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
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