module Art.Geometry where

import Control.Arrow
import Data.Biapplicative

-- | A vector in 2d euclidian space.
type Vec = (Float, Float)

both :: (a -> b) -> (a, a) -> (b, b)
both f (a, b) = (f a, f b)

addVecs :: Vec -> Vec -> Vec
addVecs = biliftA2 (+) (+)

reflectVec :: Vec -> Vec
reflectVec = both negate

subVecs :: Vec -> Vec -> Vec
subVecs v1 v2 = addVecs v1 $ reflectVec v2

scaleVec :: Float -> Vec -> Vec
scaleVec n = both (* n)