module Complex where
import qualified Data.Complex as HComplex
import Data.Complex (Complex((:+)))
toPair :: (RealFloat a) => Complex a -> (a,a)
toPair z = (HComplex.realPart z, HComplex.imagPart z)
map :: (a -> b) -> Complex a -> Complex b
map f (r :+ i) = f r :+ f i
conjugate :: (Num a) => Complex a -> Complex a
conjugate (r :+ i) = r :+ negate i
add :: (Num a) => Complex a -> Complex a -> Complex a
add (xr:+xi) (yr:+yi) = (xr+yr) :+ (xi+yi)
sub :: (Num a) => Complex a -> Complex a -> Complex a
sub (xr:+xi) (yr:+yi) = (xr-yr) :+ (xi-yi)
mul :: (Num a) => Complex a -> Complex a -> Complex a
mul (xr:+xi) (yr:+yi) = (xr*yr-xi*yi) :+ (xr*yi+xi*yr)
mulConj :: (Num a) => Complex a -> Complex a -> Complex a
mulConj x y = mul x $ conjugate y
mulConj_ :: (RealFloat a) => Complex a -> Complex a -> Complex a
mulConj_ x y = x * Complex.conjugate y