module PLY.Types (module Data.Int, module Data.Word, Format(..), Scalar(..), ScalarT(..), Property(..), Element(..), PLYType(..), Storable) where import Data.ByteString (ByteString) import Data.Int import Data.Word import Foreign.Storable (Storable) data Format = ASCII | Binary_LE | Binary_BE deriving Show data Scalar = Schar Int8 | Suchar Word8 | Sshort Int16 | Sushort Word16 | Sint Int | Suint Word32 | Sfloat Float | Sdouble Double deriving Show data ScalarT = Tchar | Tuchar | Tshort | Tushort | Tint | Tuint | Tfloat | Tdouble deriving (Eq,Show) data Property = ScalarProperty ScalarT ByteString | ListProperty ScalarT ByteString deriving Show data Element = Element { elName :: ByteString , elNum :: Int , elProps :: [Property] } deriving Show class Storable a => PLYType a where plyType :: a -> ScalarT unsafeUnwrap :: Scalar -> a instance PLYType Float where plyType _ = Tfloat unsafeUnwrap (Sfloat x) = x unsafeUnwrap y = error $ "Tried to unwrap "++show y++" as a Float" instance PLYType Double where plyType _ = Tdouble unsafeUnwrap (Sdouble x) = x unsafeUnwrap y = error $ "Tried to unwrap "++show y++" as a Double" instance PLYType Int where plyType _ = Tint unsafeUnwrap (Sint x) = x unsafeUnwrap y = error $ "Tried to unwrap "++show y++" as an Int"