{-
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 =
   T a -> a
forall a. T a -> a
Complex.real T a
s a -> v -> v
forall a v. C a v => a -> v -> v
*> v
x  v -> v -> T v
forall a. a -> a -> T a
+:  T a -> a
forall a. T a -> a
Complex.imag T a
s a -> v -> v
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 =
   (T a -> a
forall a. T a -> a
Complex.real T a
x a -> v -> v
forall a v. C a v => a -> v -> v
*> T v -> v
forall a. T a -> a
Complex.real T v
y v -> v -> v
forall a. C a => a -> a -> a
- T a -> a
forall a. T a -> a
Complex.imag T a
x a -> v -> v
forall a v. C a v => a -> v -> v
*> T v -> v
forall a. T a -> a
Complex.imag T v
y)
   v -> v -> T v
forall a. a -> a -> T a
+:
   (T a -> a
forall a. T a -> a
Complex.real T a
x a -> v -> v
forall a v. C a v => a -> v -> v
*> T v -> v
forall a. T a -> a
Complex.imag T v
y v -> v -> v
forall a. C a => a -> a -> a
+ T a -> a
forall a. T a -> a
Complex.imag T a
x a -> v -> v
forall a v. C a v => a -> v -> v
*> T 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 =
   T a -> a
forall a. T a -> a
Complex.real T a
x a -> v -> v
forall a v. C a v => a -> v -> v
*> T v -> v
forall a. T a -> a
Complex.real T v
y v -> v -> v
forall a. C a => a -> a -> a
- T a -> a
forall a. T a -> a
Complex.imag T a
x a -> v -> v
forall a v. C a v => a -> v -> v
*> T v -> v
forall a. T a -> a
Complex.imag T v
y