simple-vec3-0.3: src/Data/Vec3/Tupled.hs
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Vec3.Tupled
( TVec3(..)
)
where
import Prelude
import Data.Vector.Unboxed.Deriving
import Data.Vec3.Class
-- | 'Vec3' implementation with 'Data.Vector.Unboxed.Unbox' instance
-- based on default Unbox instance for tuples of arrays, which wraps a
-- vector of tuples as a tuple of vectors.
--
-- @
-- interface: [v1 (x, y, z); v2 (x, y, z) ...], length = N
-- | | | | | |
-- storage(x): [v1x-+ | | ; v2x-+ | | ...], length = N
-- storage(y): [v1y----+ | ; v2y----+ | ...], length = N
-- storage(z): [v1z-------+ ; v2z-------+ ...], length = N
-- @
--
-- You almost definitely want to use 'CVec3' instead as it has better
-- performance.
newtype TVec3 = TVec3 (Double, Double, Double)
deriving (Eq, Show)
derivingUnbox "TVec3"
[t|TVec3 -> (Double, Double, Double)|]
[|\(TVec3 v) -> v|]
[|TVec3|]
instance Vec3 TVec3 where
newtype Matrix TVec3 = TMatrix (TVec3, TVec3, TVec3)
deriving (Eq, Show)
fromXYZ = TVec3
{-# INLINE fromXYZ #-}
toXYZ (TVec3 v) = v
{-# INLINE toXYZ #-}
fromRows (r1, r2, r3) = TMatrix (r1, r2, r3)
{-# INLINE fromRows #-}
toRows (TMatrix (r1, r2, r3)) = (r1, r2, r3)
{-# INLINE toRows #-}
derivingUnbox "TMatrix"
[t|Matrix TVec3 -> (TVec3, TVec3, TVec3)|]
[|\(TMatrix v) -> v|]
[|TMatrix|]