aztecs-0.2.0.0: src/Data/Aztecs/Access.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Data.Aztecs.Access where
import Control.Monad.IO.Class (MonadIO)
import Control.Monad.State (MonadState (..), StateT (..))
import Data.Aztecs.Core (Component (..), EntityID)
import Data.Aztecs.World (World)
import qualified Data.Aztecs.World as W
import Data.Data (Typeable)
newtype Access m a = Access {unAccess :: StateT World m a}
deriving (Functor, Applicative, Monad, MonadIO)
runAccess :: Access m a -> World -> m (a, World)
runAccess a = runStateT (unAccess a)
spawn :: (Monad m, Component a, Typeable (StorageT a)) => a -> Access m EntityID
spawn c = Access $ do
w <- get
let (e, w') = W.spawn c w
put w'
return e
insert :: (Monad m, Component a, Typeable (StorageT a)) => EntityID -> a -> Access m ()
insert e c = Access $ do
w <- get
let w' = W.insert e c w
put w'