{-# OPTIONS_GHC -O2 -funbox-strict-fields #-}
moduleVectorwhereclass (Floating a, Ord a) => Scalar a
data (Scalar a) => Vector a =Vector !a !a
deriving (Eq, Ord, Read, Show)
data (Scalar a) => Polar a =Polar !a !a
deriving (Eq, Ord, Read, Show)
vmap:: (Scalara) => (a->a) ->Vectora->Vectoravmap f (Vector x y) =Vector (f x) (f y)
vzip:: (Scalara) => (a->a->a) ->Vectora->Vectora->Vectoravzip f (Vector x1 y1) (Vector x2 y2) =Vector (f x1 x2) (f y1 y2)
vfold:: (Scalara) => (a->a->a) ->Vectora->avfold f (Vector x y) = f x y
(|+|):: (Scalara) =>Vectora->Vectora->Vectora(|+|)= vzip (+)(|-|):: (Scalara) =>Vectora->Vectora->Vectora(|-|)= vzip (-)
(|*|) :: (Scalar a) => Vector a -> Vector a -> a
v |*| w = vfold (+) (vzip (*) v w)
(|+):: (Scalara) =>Vectora->a->Vectorav |+ a = withPolarRadius v $ \r -> r + a
(+|):: (Scalara) =>a->Vectora->Vectoraa +| v = withPolarRadius v $ \r -> a + r
(|-):: (Scalara) =>Vectora->a->Vectorav |- a = withPolarRadius v $ \r -> r - a
(-|):: (Scalara) =>a->Vectora->Vectoraa -| v = withPolarRadius v $ \r -> a - r
(|*) :: (Scalar a) => Vector a -> a -> Vector a
v |* a = vmap (* a) v
(*|) :: (Scalar a) => a -> Vector a -> Vector a
a *| v = vmap (a *) v
(|/):: (Scalara) =>Vectora->a->Vectorav |/ a = vmap (/ a) v
(/|):: (Scalara) =>a->Vectora->Vectoraa /| v = vmap (a /) v
vmag:: (Scalara) =>Vectora->avmag v =sqrt (v |*| v)
vang:: (Scalara) =>Vectora->avang (Vector x y) | x > 0 && y >= 0 =atan (y / x)
| x > 0 && y < 0 =atan (y / x) + 2 * pi| x < 0 =atan (y / x) + pi| x == 0 && y > 0 =pi / 2
| x == 0 && y < 0 = 3 * pi / 2
| x == 0 && y == 0 = 0
toVector:: (Scalara) =>Polara->VectoratoVector (Polar r t) = r *|Vector (cos t) (sin t)
toPolar:: (Scalara) =>Vectora->PolaratoPolar v =Polar (vmag v) (vang v)
withPolar:: (Scalara) =>Vectora-> (Polara->Polara) ->VectorawithPolar v f = toVector (f (toPolar v))
withPolarRadius:: (Scalara) =>Vectora-> (a->a) ->VectorawithPolarRadius v f = withPolar v $ \(Polar r t) -> Polar (f r) t