aztecs-0.13.0: examples/ECS.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
module Main where
import Aztecs.ECS
import qualified Aztecs.ECS.Query as Q
import qualified Aztecs.ECS.World as W
import Control.Monad.IO.Class
newtype Position = Position Int
deriving (Show, Eq)
newtype Velocity = Velocity Int
deriving (Show, Eq)
data MoveSystem = MoveSystem
instance (PrimMonad m, MonadIO m) => System m MoveSystem where
type SystemInputs m MoveSystem = Query m (W m Position, R Velocity)
runSystem MoveSystem q = do
results <- Q.runQuery q
mapM_ go results
where
go (posRef, R (Velocity v)) = do
modifyW posRef $ \(Position p) -> Position (p + v)
p <- readW posRef
liftIO $ putStrLn $ "Moved to: " ++ show p
main :: IO ()
main = do
world <- W.empty @_ @'[Position, Velocity]
runAztecsT_ go world
where
go = do
_ <- spawn (bundle (Position 0) <> bundle (Velocity 1))
runSystemWithWorld MoveSystem