A modular game engine and ECS for Haskell. An ECS is a modern approach to organizing your application state as a database, providing patterns for data-oriented design and parallel processing.
- Type-safe: Queries and systems use fully type-checked access with compile-time gurantees
- High-performance: Components are stored by their unique sets in archetypes
- Modular design: Aztecs can be extended for a variety of use cases
import Aztecs
import qualified Aztecs.World as W
import Control.Monad.IO.Class
newtype Position = Position Int
deriving (Show, Eq)
instance (Monad m) => Component m Position where
type ComponentStorage m Position = SparseStorage m
newtype Velocity = Velocity Int
deriving (Show, Eq)
instance (Monad m) => Component m Velocity where
type ComponentStorage m Velocity = SparseStorage m
data MoveSystem = MoveSystem
instance (PrimMonad m, MonadIO m) => System m MoveSystem where
type SystemIn m MoveSystem = Query (W m Position, R Velocity)
runSystem _ = mapM_ go
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))
system MoveSystem