aztecs-0.14.0: src/Aztecs/World/Entities.hs
module Aztecs.World.Entities where
import Aztecs.Entity
import Data.IntMap (IntMap)
import qualified Data.IntMap as IntMap
import Data.Word
data Entities = Entities
{ entitiesNextGeneration :: Word32,
entitiesGenerations :: IntMap Word32,
entitiesNextIndex :: Word32,
entitiesFreeIndicies :: [Word32]
}
emptyEntities :: Entities
emptyEntities = Entities 0 IntMap.empty 0 []
{-# INLINE emptyEntities #-}
mkEntityWithCounter :: Entities -> (Entity, Entities)
mkEntityWithCounter (Entities gen gens index free) =
let (i, nextIndex, free') = case free of
(i' : rest) -> (i', index, rest)
[] -> (index, index + 1, [])
nextGeneration = gen + 1
gens' = IntMap.insert (fromIntegral i) gen gens
in (mkEntity i gen, Entities nextGeneration gens' nextIndex free')
{-# INLINE mkEntityWithCounter #-}
entities :: Entities -> [Entity]
entities (Entities _ gens _ _) = map go (IntMap.toList gens)
where
go (i, gen) = mkEntity (fromIntegral i) gen
{-# INLINE entities #-}