\begin{code}
{-# LANGUAGE NoImplicitPrelude, RankNTypes #-}
module Numeric.Clifford.LinearOperators where
import NumericPrelude
import Numeric.Clifford.Multivector
import Algebra.Algebraic
import Algebra.Transcendental
import GHC.TypeLits
\end{code} What is a linear operator? Just a Vector -> Vector! \begin{code}
type LinearOperator p q f = Multivector p q f -> Multivector p q f
type LinearOperatorCreator p q f = (Algebra.Algebraic.C f, Ord f, SingI p, SingI q) => Multivector p q f -> LinearOperator p q f

reflect u x = (-u)*x*recip u

makeReflectionOperator ::LinearOperatorCreator p q f
makeReflectionOperator u = reflect u

rotate spinor x = (reverseMultivector spinor) * x * spinor
rotatePlaneAngle plane angle = rotate (exp (((fst.normalised) plane) * (angle/2)))

makeRotationOperator :: LinearOperatorCreator p q f
makeRotationOperator u = rotate u

project u x = inverse u * (u `dot` x)

makeProjectionOperator :: LinearOperatorCreator p q f
makeProjectionOperator u = project u

\end{code}