{-
Maybe this module should be moved to NumericPrelude.
-}
module Synthesizer.Basic.ComplexModule where

import qualified Number.Complex as Complex
import qualified Algebra.Module as Module
import Number.Complex ((+:), )

import NumericPrelude.Numeric
import Prelude ()


{-# INLINE scale #-}
scale :: (Module.C a v) =>
   Complex.T a -> v -> Complex.T v
scale :: forall a v. C a v => T a -> v -> T v
scale T a
s v
x =
   forall a. T a -> a
Complex.real T a
s forall a v. C a v => a -> v -> v
*> v
x  forall a. a -> a -> T a
+:  forall a. T a -> a
Complex.imag T a
s forall a v. C a v => a -> v -> v
*> v
x

{-# INLINE mul #-}
mul :: (Module.C a v) =>
   Complex.T a -> Complex.T v -> Complex.T v
mul :: forall a v. C a v => T a -> T v -> T v
mul T a
x T v
y =
   (forall a. T a -> a
Complex.real T a
x forall a v. C a v => a -> v -> v
*> forall a. T a -> a
Complex.real T v
y forall a. C a => a -> a -> a
- forall a. T a -> a
Complex.imag T a
x forall a v. C a v => a -> v -> v
*> forall a. T a -> a
Complex.imag T v
y)
   forall a. a -> a -> T a
+:
   (forall a. T a -> a
Complex.real T a
x forall a v. C a v => a -> v -> v
*> forall a. T a -> a
Complex.imag T v
y forall a. C a => a -> a -> a
+ forall a. T a -> a
Complex.imag T a
x forall a v. C a v => a -> v -> v
*> forall a. T a -> a
Complex.real T v
y)

{-# INLINE project #-}
project :: (Module.C a v) =>
   Complex.T a -> Complex.T v -> v
project :: forall a v. C a v => T a -> T v -> v
project T a
x T v
y =
   forall a. T a -> a
Complex.real T a
x forall a v. C a v => a -> v -> v
*> forall a. T a -> a
Complex.real T v
y forall a. C a => a -> a -> a
- forall a. T a -> a
Complex.imag T a
x forall a v. C a v => a -> v -> v
*> forall a. T a -> a
Complex.imag T v
y