HGamer3D-0.6.2: HGamer3D/Data/Component.hs
{-
Components are pieces of the handcrafted record system
HGamer3D Library (A project to enable 3D game development in Haskell)
Copyright 2015 Peter Althainz
Distributed under the Apache License, Version 2.0
(See attached file LICENSE or copy at
http://www.apache.org/licenses/LICENSE-2.0)
file: HGamer3D/Data/Component.hs
-}
{-# LANGUAGE TypeSynonymInstances #-}
-- | Components of the Entity Component System of HGamer3D
module HGamer3D.Data.Component
(
ComponentType (..),
Component,
ComponentClass (..)
)
where
import Data.Word
import Data.MessagePack
import Data.ByteString
import Data.Text
import Data.Text.Encoding
-- | Components in Entities are indexed by ComponentType
data ComponentType a = ComponentType Word64 deriving (Eq, Show, Ord)
-- | Components are stored as ByteString
type Component = ByteString
-- | ComponentClass is the typeclass of data types, which can be components
class ComponentClass a where
toObj :: a -> Object
fromObj :: Object -> a
instance ComponentClass () where
toObj () = ObjectNil
fromObj ObjectNil = ()
instance ComponentClass Text where
toObj text = ObjectString (encodeUtf8 text)
fromObj (ObjectString bs) = decodeUtf8 bs
instance ComponentClass (ComponentType a) where
toObj (ComponentType i) = ObjectInt (fromIntegral i)
fromObj (ObjectInt i) = ComponentType (fromIntegral i)
instance ComponentClass Bool where
toObj b = ObjectBool b
fromObj (ObjectBool b) = b
instance ComponentClass Int where
toObj i = ObjectInt (fromIntegral i)
fromObj (ObjectInt i) = fromIntegral i
instance ComponentClass a => ComponentClass (Maybe a) where
toObj Nothing = ObjectArray [ObjectInt 0]
toObj (Just v) = ObjectArray [ObjectInt 1, toObj v]
fromObj (ObjectArray [ObjectInt 0]) = Nothing
fromObj (ObjectArray [ObjectInt 1, v_o]) = Just (fromObj v_o)