packages feed

geomancy-0.2.4.0: src/Geomancy/Vector.hs

{-# 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
(^*) = flip (*^)

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

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

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