{-# Language FlexibleInstances #-}
-- | Class and associated functions for 'Matrix' transformations.
module Graphics.PS.Transform where

import qualified Data.CG.Minus as CG {- hcg-minus -}

import qualified Graphics.PS.Path as P
import qualified Graphics.PS.Image as I

-- | Values that can be transformed in relation to a 'Matrix'.
class Transformable t where
    mtransform :: CG.Matrix Double -> t -> t

-- | Translation in /x/ and /y/.
translate :: Transformable t => Double -> Double -> t -> t
translate x = mtransform . CG.mx_translation x

-- | Scaling in /x/ and /y/.
scale :: Transformable t => Double -> Double -> t -> t
scale x = mtransform . CG.mx_scaling x

-- | Rotation, in radians.
rotate :: Transformable t => Double -> t -> t
rotate = mtransform . CG.mx_rotation

instance Transformable I.Image where
    mtransform = I.ITransform

instance Transformable P.Path where
    mtransform = P.PTransform

instance Transformable (CG.Pt Double) where
    mtransform = CG.pt_transform

{--
import Graphics.PS.Pt

-- | Polar variant.
pTranslate :: (Transform a) => Double -> Double -> a -> a
pTranslate r t = translate x y
    where (Pt x y) = polarToRectangular (Pt r t)

--}