apecs: Fast ECS framework for game programming

[ bsd3, control, data, game, library ] [ Propose Tags ]

Entity-Component-System frameworks provide a game programming paradigm that tackles many of the shortcomings of a more OO-oriented approach. apecs is a type-driven ECS, that leverages strong typing for an expressive DSL that turns into fast game code.

[Skip to Readme]
Versions,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 0.7.0, 0.7.1
Change log CHANGELOG.md
Dependencies base (>=4.7 && <5), containers, mtl, template-haskell, vector [details]
License BSD-3-Clause
Author Jonas Carpay
Maintainer jonascarpay@gmail.com
Category Game, Control, Data
Home page https://github.com/jonascarpay/apecs#readme
Source repo head: git clone git://github.com/jonascarpay/apecs.git
Uploaded by jonascarpay at Sat Dec 15 20:19:27 UTC 2018
Distributions LTSHaskell:0.7.1, NixOS:0.7.1, Stackage:0.7.1
Downloads 4424 total (182 in the last 30 days)
Rating (no votes yet) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs available [build log]
Last success reported on 2018-12-15 [all 1 reports]


[Index] [Quick Jump]


Maintainer's Corner

For package maintainers and hackage trustees

Readme for apecs-0.7.1

[back to package description]


apecs is an Entity Component System (ECS) framework inspired by specs and Entitas. ECS presents a data-driven approach to game development, that elegantly tackles many of the unique issues of game programming. apecs aims to be

  • Fast - apecs is designed for high-performance applications. Its performance is competitive with Rust ECS libraries.
  • Simple - Game logic is expressed using a small number of combinators, and minimal boilerplate.
  • Safe - The cmap/cfold-DSL hides all the dangers of the low-level API.
  • Extensible - apecs can be used with anything that implements the low-level API. See apecs-physics or apecs-stm for examples.



ecs-bench shows that apecs is competitive with the fastest Rust ECS frameworks.



{-# LANGUAGE DataKinds, FlexibleInstances, ScopedTypeVariables, TypeFamilies, MultiParamTypeClasses, TemplateHaskell #-}

import Apecs
import Control.Monad
import Apecs.Util
import Linear (V2 (..))

newtype Position = Position (V2 Double) deriving Show
newtype Velocity = Velocity (V2 Double) deriving Show
data Flying = Flying

makeWorldAndComponents "World" [''Position, ''Velocity, ''Flying]

game :: System World ()
game = do
  newEntity (Position 0, Velocity 1)
  newEntity (Position 2, Velocity 1)
  newEntity (Position 1, Velocity 2, Flying)

  -- 1. Add velocity to position
  -- 2. Apply gravity to non-flying entities
  -- 3. Print a list of entities and their positions
  cmap $ \(Position p, Velocity v) -> Position (v+p)
  cmap $ \(Velocity v, _ :: Not Flying) -> Velocity (v - V2 0 1)
  cmapM_ $ \(Position p, Entity e) -> liftIO . print $ (e, p)

main :: IO ()
main = initWorld >>= runSystem game