{-# 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
^* :: v -> a -> v
(^*) = (a -> v -> v) -> v -> a -> v
forall a b c. (a -> b -> c) -> b -> a -> c
flip a -> v -> v
forall v a. VectorSpace v a => a -> v -> v
(*^)

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

{-# INLINE lerp #-}
lerp :: VectorSpace v a => v -> v -> a -> v
lerp :: v -> v -> a -> v
lerp = v -> v -> a -> v
forall v a. VectorSpace v a => v -> v -> a -> v
linear

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