{-# LANGUAGE FlexibleContexts #-}

module Geomancy.Vector
  ( VectorSpace(..)
  , (^*)
  , quadrance
  , lerp
  , lerpClip
  ) where

import Data.VectorSpace (VectorSpace(..))
import Geomancy.Interpolate (linear)

{-# INLINE (^*) #-}
(^*) :: VectorSpace v a => v -> a -> v
^* :: forall v a. VectorSpace v a => v -> a -> v
(^*) = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall v a. VectorSpace v a => a -> v -> v
(*^)

{-# INLINE quadrance #-}
quadrance :: VectorSpace v a => v -> a
quadrance :: forall v a. VectorSpace v a => v -> a
quadrance v
v = forall v a. VectorSpace v a => v -> v -> a
dot v
v v
v

{-# INLINE lerp #-}
lerp :: (VectorSpace v a, Num a) => v -> v -> a -> v
lerp :: forall v a. (VectorSpace v a, Num a) => v -> v -> a -> v
lerp = forall v a. (VectorSpace v a, Num a) => v -> v -> a -> v
linear

{-# INLINE lerpClip #-}
lerpClip :: (VectorSpace v a, Ord a, Num a) => v -> v -> a -> v
lerpClip :: forall v a. (VectorSpace v a, Ord a, Num a) => v -> v -> a -> v
lerpClip v
a v
b a
t
  | a
t forall a. Ord a => a -> a -> Bool
<= a
0 = v
a
  | a
t forall a. Ord a => a -> a -> Bool
>= a
1 = v
b
  | Bool
otherwise = forall v a. (VectorSpace v a, Num a) => v -> v -> a -> v
lerp v
a v
b a
t