module Data.VectorSpace
(
module Data.AdditiveGroup
, VectorSpace(..), (^/), (^*)
, InnerSpace(..)
, lerp, magnitudeSq, magnitude, normalized
) where
import Data.Complex hiding (magnitude)
import Data.AdditiveGroup
infixr 7 *^, ^/, <.>
infixl 7 ^*
class AdditiveGroup v => VectorSpace v s | v -> s where
(*^) :: s -> v -> v
class VectorSpace v s => InnerSpace v s where
(<.>) :: v -> v -> s
(^/) :: (Fractional s, VectorSpace v s) => v -> s -> v
v ^/ s = (1/s) *^ v
(^*) :: VectorSpace v s => v -> s -> v
(^*) = flip (*^)
lerp :: (VectorSpace v s, Num s) => v -> v -> s -> v
lerp a b t = (1t)*^a ^+^ t*^b
magnitudeSq :: InnerSpace v s => v -> s
magnitudeSq v = v <.> v
magnitude :: (InnerSpace v s, Floating s) => v -> s
magnitude = sqrt . magnitudeSq
normalized :: (InnerSpace v s, Floating s) => v -> v
normalized v = v ^/ magnitude v
instance VectorSpace Double Double where (*^) = (*)
instance InnerSpace Double Double where (<.>) = (*)
instance VectorSpace Float Float where (*^) = (*)
instance InnerSpace Float Float where (<.>) = (*)
instance (RealFloat v, VectorSpace v s) => VectorSpace (Complex v) s where
s*^(u :+ v) = s*^u :+ s*^v
instance (RealFloat v, InnerSpace v s, VectorSpace s s')
=> InnerSpace (Complex v) s where
(u :+ v) <.> (u' :+ v') = (u <.> u') ^+^ (v <.> v')
instance (VectorSpace u s,VectorSpace v s) => VectorSpace (u,v) s where
s *^ (u,v) = (s*^u,s*^v)
instance (InnerSpace u s,InnerSpace v s, VectorSpace s s')
=> InnerSpace (u,v) s where
(u,v) <.> (u',v') = (u <.> u') ^+^ (v <.> v')
instance (VectorSpace u s,VectorSpace v s,VectorSpace w s)
=> VectorSpace (u,v,w) s where
s *^ (u,v,w) = (s*^u,s*^v,s*^w)
instance (InnerSpace u s,InnerSpace v s,InnerSpace w s, VectorSpace s s')
=> InnerSpace (u,v,w) s where
(u,v,w) <.> (u',v',w') = u<.>u' ^+^ v<.>v' ^+^ w<.>w'