AC-Vector-2.4.0: Data/Vector/Transform/T1.hs
{- |
1-dimensional linear transformations.
-}
module Data.Vector.Transform.T1 where
import Data.Semigroup
import Data.Monoid
import Data.Vector.Class
import Data.Vector.V1
{- |
The type of 1D linear transformations. Essentially, this is applying a linear function to a number.
Note the @Monoid@ instance, which gives you access to the identity transform (@mempty@) and the ability to combine a series of transforms into a single transform (@mappend@).
-}
data Transform1 =
Transform1
{
t1_XX, t1_1X :: {-# UNPACK #-} !Scalar
}
deriving (Eq, Show)
instance Monoid Transform1 where
mempty = Transform1 1 0
instance Semigroup Transform1 where
a <> b =
Transform1
{
t1_XX = t1_XX a * t1_XX b,
t1_1X = t1_1X a * t1_XX b + t1_1X b
}
-- | Apply a 1D transformation to a 1D point, yielding a new 1D point.
transformP1 :: Transform1 -> Vector1 -> Vector1
transformP1 a (Vector1 x) = Vector1 (t1_XX a * x + t1_1X a)