{-# 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