-- |
-- Bidirectional version of "Data.Complex".
{-# LANGUAGE Safe, QuasiQuotes, TypeOperators #-}
module Data.Invertible.Complex
  ( complex
  , polar
  , conjugate
  ) where

import qualified Data.Complex as C

import Data.Invertible.Bijection
import Data.Invertible.Internal
import Data.Invertible.TH

-- |Convert between 'Complex' numbers and rectangular form.
complex :: (a, a) <-> C.Complex a
complex :: forall a. (a, a) <-> Complex a
complex = [biCase|(r, i) <-> r C.:+ i|]

-- |Convert between complex numbers and 'C.polar' form.
polar :: RealFloat a => (a, a) <-> C.Complex a
polar :: forall a. RealFloat a => (a, a) <-> Complex a
polar = forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall a. Floating a => a -> a -> Complex a
C.mkPolar forall (a :: * -> * -> *) b c. a b c -> a c b -> Bijection a b c
:<->: forall a. RealFloat a => Complex a -> (a, a)
C.polar

-- |The 'C.conjugate' of a complex number.
conjugate :: Num a => C.Complex a <-> C.Complex a
conjugate :: forall a. Num a => Complex a <-> Complex a
conjugate = forall (a :: * -> * -> *) b. a b b -> Bijection a b b
involution forall a. Num a => Complex a -> Complex a
C.conjugate