update maintainer email
[complex-generic:complex-generic.git] / Data / Complex / Generic.hs
1 {-# LANGUAGE DeriveDataTypeable, TemplateHaskell, MultiParamTypeClasses, FlexibleInstances #-}
2 {- |
3 Module      :  Data.Complex.Generic
4 Copyright   :  (c) Claude Heiland-Allen 2012
5 License     :  BSD3
6
7 Maintainer  :  claude@mathr.co.uk
8 Stability   :  unstable
9 Portability :  DeriveDataTypeable, TemplateHaskell, MultiParamTypeClasses, FlexibleInstances
10
11 Complex numbers.
12 -}
13 module Data.Complex.Generic
14   ( module Data.Complex.Generic.Class
15   , Complex((:+))
16   , toDataComplex
17   , fromDataComplex
18   ) where
19
20 import Data.Data (Data)
21 import Data.Typeable (Typeable)
22
23 import Foreign.C (CFloat, CDouble)
24 import Data.Int
25 import Data.Word
26 import Data.Fixed
27 import Data.Ratio
28
29 import qualified Data.Complex as X
30
31 import Data.Complex.Generic.Class
32 import Data.Complex.Generic.Default
33 import Data.Complex.Generic.TH
34
35 -- | Complex numbers in rectangular form.
36 data Complex a = !a :+ !a
37   deriving (Eq, Show, Read, Data, Typeable)
38 infix 6 :+
39
40 -- | Convert to 'Data.Complex.Complex'.
41 toDataComplex :: Complex r -> X.Complex r
42 toDataComplex (x :+ y) = x X.:+ y
43
44 -- | Convert from 'Data.Complex.Complex'.
45 fromDataComplex :: X.Complex r -> Complex r
46 fromDataComplex (x X.:+ y) = x :+ y
47
48 instance Functor Complex where
49   fmap f (x :+ y) = f x :+ f y
50
51 mk :: a -> a -> Complex a
52 {- needed because of this bug(?) in TemplateHaskell
53     Illegal variable name: `:+'
54     When splicing a TH declaration
55 -}
56 mk = (:+)
57
58 toPair :: Complex a -> (a, a)
59 toPair (x :+ y) = (x, y)
60
61 deriveComplexRF ''Complex ''Float 'mk 'toPair
62 deriveComplexRF ''Complex ''Double 'mk 'toPair
63 deriveComplexRF ''Complex ''CFloat 'mk 'toPair
64 deriveComplexRF ''Complex ''CDouble 'mk 'toPair
65
66 deriveComplexN ''Complex ''Integer 'mk 'toPair
67 deriveComplexN ''Complex ''Int 'mk 'toPair
68 deriveComplexN ''Complex ''Int8 'mk 'toPair
69 deriveComplexN ''Complex ''Int16 'mk 'toPair
70 deriveComplexN ''Complex ''Int32 'mk 'toPair
71 deriveComplexN ''Complex ''Int64 'mk 'toPair
72 deriveComplexN ''Complex ''Word 'mk 'toPair
73 deriveComplexN ''Complex ''Word8 'mk 'toPair
74 deriveComplexN ''Complex ''Word16 'mk 'toPair
75 deriveComplexN ''Complex ''Word32 'mk 'toPair
76 deriveComplexN ''Complex ''Word64 'mk 'toPair
77 {-
78 deriveComplex1F ''Complex ''HasResolution ''Fixed 'mk 'toPair
79 deriveComplex1F ''Complex ''Integral ''Ratio 'mk 'toPair
80 -}
81
82 instance HasResolution t => ComplexRect (Complex (Fixed t)) (Fixed t) where
83   mkRect = (:+)
84   rect (x :+ y) = (x, y)
85   real = realDefault
86   imag = imagDefault
87   realPart = realPartDefault
88   imagPart = imagPartDefault
89   conjugate = conjugateDefault
90   magnitudeSquared = magnitudeSquaredDefault
91   sqr = sqrDefault
92   (.*) = rmulDefault
93   (*.) = mulrDefault
94
95 instance HasResolution t => Num (Complex (Fixed t)) where
96   (+) = addDefault
97   (-) = subDefault
98   (*) = mulDefault
99   negate = negateDefault
100   fromInteger = fromIntegerDefault
101   abs = error $ "Num.abs: not implementable for Complex Fixed"
102   signum = error $ "Num.signum: not implementable for Complex Fixed"
103
104 instance HasResolution t => Fractional (Complex (Fixed t)) where
105   (/) = divDefault
106   fromRational = fromRationalDefault
107
108 instance Integral t => ComplexRect (Complex (Ratio t)) (Ratio t) where
109   mkRect = (:+)
110   rect (x :+ y) = (x, y)
111   real = realDefault
112   imag = imagDefault
113   realPart = realPartDefault
114   imagPart = imagPartDefault
115   conjugate = conjugateDefault
116   magnitudeSquared = magnitudeSquaredDefault
117   sqr = sqrDefault
118   (.*) = rmulDefault
119   (*.) = mulrDefault
120
121 instance Integral t => Num (Complex (Ratio t)) where
122   (+) = addDefault
123   (-) = subDefault
124   (*) = mulDefault
125   negate = negateDefault
126   fromInteger = fromIntegerDefault
127   abs = error $ "Num.abs: not implementable for Complex Ratio"
128   signum = error $ "Num.signum: not implementable for Complex Ratio"
129
130 instance Integral t => Fractional (Complex (Ratio t)) where
131   (/) = divDefault
132   fromRational = fromRationalDefault