| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Apecs.Core
Synopsis
- newtype Entity = Entity {}
- newtype System w a = System {}
- class Elem (Storage c) ~ c => Component c where
- type Storage c
- class Component c => Has w c where
- type family Elem s
- class ExplInit s where
- class ExplGet s where
- class ExplSet s where
- class ExplDestroy s where
- class ExplMembers s where
- type Get w c = (Has w c, ExplGet (Storage c))
- type Set w c = (Has w c, ExplSet (Storage c))
- type Members w c = (Has w c, ExplMembers (Storage c))
- type Destroy w c = (Has w c, ExplDestroy (Storage c))
- data Not a = Not
- newtype NotStore s = NotStore s
- newtype MaybeStore s = MaybeStore s
- data EitherStore sa sb = EitherStore sa sb
- data Filter c = Filter
- newtype FilterStore s = FilterStore s
- data EntityStore = EntityStore
Documentation
An Entity is just an integer, used to index into a component store.
In general, use newEntity, cmap, and component tags instead of manipulating these directly.
For performance reasons, negative values like (-1) are reserved for stores to represent special values, so avoid using these.
A System is a newtype around `ReaderT w IO a`, where w is the game world variable.
Systems mainly serve to
- Lift side effects into the IO Monad.
- Allow type-based lookup of a component's store through
getStore.
class Elem (Storage c) ~ c => Component c #
A component is defined by specifying how it is stored. The constraint ensures that stores and components are mapped one-to-one.
Instances
| Component () # | |
Defined in Apecs.Core | |
| Component Entity # | |
Defined in Apecs.Core | |
| Component EntityCounter # | |
Defined in Apecs.Util Associated Types type Storage EntityCounter :: * # | |
| Component c => Component (Maybe c) # | |
Defined in Apecs.Core | |
| Component c => Component (Identity c) # | Identity component/store. |
Defined in Apecs.Core | |
| Component c => Component (Filter c) # | |
Defined in Apecs.Core | |
| Component c => Component (Not c) # | |
Defined in Apecs.Core | |
| (Component ca, Component cb) => Component (Either ca cb) # | |
Defined in Apecs.Core | |
| (Component t_0, Component t_1) => Component (t_0, t_1) # | |
Defined in Apecs.Core | |
| (Component t_0, Component t_1, Component t_2) => Component (t_0, t_1, t_2) # | |
Defined in Apecs.Core | |
| (Component t_0, Component t_1, Component t_2, Component t_3) => Component (t_0, t_1, t_2, t_3) # | |
Defined in Apecs.Core | |
| (Component t_0, Component t_1, Component t_2, Component t_3, Component t_4) => Component (t_0, t_1, t_2, t_3, t_4) # | |
Defined in Apecs.Core | |
| (Component t_0, Component t_1, Component t_2, Component t_3, Component t_4, Component t_5) => Component (t_0, t_1, t_2, t_3, t_4, t_5) # | |
Defined in Apecs.Core | |
| (Component t_0, Component t_1, Component t_2, Component t_3, Component t_4, Component t_5, Component t_6) => Component (t_0, t_1, t_2, t_3, t_4, t_5, t_6) # | |
Defined in Apecs.Core | |
| (Component t_0, Component t_1, Component t_2, Component t_3, Component t_4, Component t_5, Component t_6, Component t_7) => Component (t_0, t_1, t_2, t_3, t_4, t_5, t_6, t_7) # | |
Defined in Apecs.Core | |
class Component c => Has w c where #
Has w c means that world w can produce a Storage c.
Minimal complete definition
Instances
| Has w Entity # | |
| Has w () # | |
Defined in Apecs.Core | |
| Has w c => Has w (Identity c) # | |
| Has w c => Has w (Filter c) # | |
| Has w c => Has w (Maybe c) # | |
| Has w c => Has w (Not c) # | |
| (Has w ca, Has w cb) => Has w (Either ca cb) # | |
| (Has w t_0, Has w t_1) => Has w (t_0, t_1) # | |
Defined in Apecs.Core | |
| (Has w t_0, Has w t_1, Has w t_2) => Has w (t_0, t_1, t_2) # | |
Defined in Apecs.Core | |
| (Has w t_0, Has w t_1, Has w t_2, Has w t_3) => Has w (t_0, t_1, t_2, t_3) # | |
Defined in Apecs.Core | |
| (Has w t_0, Has w t_1, Has w t_2, Has w t_3, Has w t_4) => Has w (t_0, t_1, t_2, t_3, t_4) # | |
Defined in Apecs.Core | |
| (Has w t_0, Has w t_1, Has w t_2, Has w t_3, Has w t_4, Has w t_5) => Has w (t_0, t_1, t_2, t_3, t_4, t_5) # | |
Defined in Apecs.Core | |
| (Has w t_0, Has w t_1, Has w t_2, Has w t_3, Has w t_4, Has w t_5, Has w t_6) => Has w (t_0, t_1, t_2, t_3, t_4, t_5, t_6) # | |
Defined in Apecs.Core | |
| (Has w t_0, Has w t_1, Has w t_2, Has w t_3, Has w t_4, Has w t_5, Has w t_6, Has w t_7) => Has w (t_0, t_1, t_2, t_3, t_4, t_5, t_6, t_7) # | |
Defined in Apecs.Core | |
The type of components stored by a store, e.g. Elem (Map c) = c.
Instances
| type Elem () # | |
Defined in Apecs.Core type Elem () = () | |
| type Elem EntityStore # | |
Defined in Apecs.Core | |
| type Elem (Identity s) # | |
Defined in Apecs.Core | |
| type Elem (FilterStore s) # | |
Defined in Apecs.Core | |
| type Elem (MaybeStore s) # | |
Defined in Apecs.Core | |
| type Elem (NotStore s) # | |
Defined in Apecs.Core | |
| type Elem (Global c) # | |
Defined in Apecs.Stores | |
| type Elem (Unique c) # | |
Defined in Apecs.Stores | |
| type Elem (Map c) # | |
Defined in Apecs.Stores | |
| type Elem (t_0, t_1) # | |
Defined in Apecs.Core | |
| type Elem (EitherStore sa sb) # | |
Defined in Apecs.Core | |
| type Elem (Cache n s) # | |
Defined in Apecs.Stores | |
| type Elem (t_0, t_1, t_2) # | |
Defined in Apecs.Core | |
| type Elem (t_0, t_1, t_2, t_3) # | |
| type Elem (t_0, t_1, t_2, t_3, t_4) # | |
| type Elem (t_0, t_1, t_2, t_3, t_4, t_5) # | |
| type Elem (t_0, t_1, t_2, t_3, t_4, t_5, t_6) # | |
| type Elem (t_0, t_1, t_2, t_3, t_4, t_5, t_6, t_7) # | |
Indicates that the store s can be initialized.
Generally, "base" stores like Map c can be initialized, but composite stores like MaybeStore s cannot.
Minimal complete definition
Instances
| Monoid c => ExplInit (Global c) # | |
Defined in Apecs.Stores | |
| ExplInit (Unique c) # | |
Defined in Apecs.Stores | |
| ExplInit (Map c) # | |
Defined in Apecs.Stores | |
| (ExplInit s, KnownNat n, Cachable s) => ExplInit (Cache n s) # | |
Defined in Apecs.Stores | |
Stores that we can read using explGet and explExists.
For some entity e, eplGet s e is only guaranteed to be safe if explExists s e returns True.
Minimal complete definition
Methods
explGet :: s -> Int -> IO (Elem s) #
Reads a component from the store. What happens if the component does not exist is left undefined, and might not necessarily crash.
explExists :: s -> Int -> IO Bool #
Returns whether there is a component for the given index.
Instances
Stores that can be written.
Minimal complete definition
Instances
| ExplSet () # | |
| ExplSet s => ExplSet (Identity s) # | |
| (ExplDestroy s, ExplSet s) => ExplSet (MaybeStore s) # | |
Defined in Apecs.Core Methods explSet :: MaybeStore s -> Int -> Elem (MaybeStore s) -> IO () # | |
| ExplDestroy s => ExplSet (NotStore s) # | |
| ExplSet (Global c) # | |
| ExplSet (Unique c) # | |
| ExplSet (Map c) # | |
| (ExplSet t_0, ExplSet t_1) => ExplSet (t_0, t_1) # | |
| (ExplSet sa, ExplSet sb) => ExplSet (EitherStore sa sb) # | |
Defined in Apecs.Core Methods explSet :: EitherStore sa sb -> Int -> Elem (EitherStore sa sb) -> IO () # | |
| ExplSet s => ExplSet (Cache n s) # | |
| (ExplSet t_0, ExplSet t_1, ExplSet t_2) => ExplSet (t_0, t_1, t_2) # | |
| (ExplSet t_0, ExplSet t_1, ExplSet t_2, ExplSet t_3) => ExplSet (t_0, t_1, t_2, t_3) # | |
| (ExplSet t_0, ExplSet t_1, ExplSet t_2, ExplSet t_3, ExplSet t_4) => ExplSet (t_0, t_1, t_2, t_3, t_4) # | |
| (ExplSet t_0, ExplSet t_1, ExplSet t_2, ExplSet t_3, ExplSet t_4, ExplSet t_5) => ExplSet (t_0, t_1, t_2, t_3, t_4, t_5) # | |
| (ExplSet t_0, ExplSet t_1, ExplSet t_2, ExplSet t_3, ExplSet t_4, ExplSet t_5, ExplSet t_6) => ExplSet (t_0, t_1, t_2, t_3, t_4, t_5, t_6) # | |
| (ExplSet t_0, ExplSet t_1, ExplSet t_2, ExplSet t_3, ExplSet t_4, ExplSet t_5, ExplSet t_6, ExplSet t_7) => ExplSet (t_0, t_1, t_2, t_3, t_4, t_5, t_6, t_7) # | |
class ExplDestroy s where #
Stores that components can be removed from.
Minimal complete definition
Instances
| ExplDestroy () # | |
Defined in Apecs.Core Methods explDestroy :: () -> Int -> IO () # | |
| ExplDestroy s => ExplDestroy (Identity s) # | |
Defined in Apecs.Core Methods explDestroy :: Identity s -> Int -> IO () # | |
| ExplDestroy (Unique c) # | |
Defined in Apecs.Stores Methods explDestroy :: Unique c -> Int -> IO () # | |
| ExplDestroy (Map c) # | |
Defined in Apecs.Stores Methods explDestroy :: Map c -> Int -> IO () # | |
| (ExplDestroy t_0, ExplDestroy t_1) => ExplDestroy (t_0, t_1) # | |
Defined in Apecs.Core Methods explDestroy :: (t_0, t_1) -> Int -> IO () # | |
| ExplDestroy s => ExplDestroy (Cache n s) # | |
Defined in Apecs.Stores Methods explDestroy :: Cache n s -> Int -> IO () # | |
| (ExplDestroy t_0, ExplDestroy t_1, ExplDestroy t_2) => ExplDestroy (t_0, t_1, t_2) # | |
Defined in Apecs.Core Methods explDestroy :: (t_0, t_1, t_2) -> Int -> IO () # | |
| (ExplDestroy t_0, ExplDestroy t_1, ExplDestroy t_2, ExplDestroy t_3) => ExplDestroy (t_0, t_1, t_2, t_3) # | |
Defined in Apecs.Core Methods explDestroy :: (t_0, t_1, t_2, t_3) -> Int -> IO () # | |
| (ExplDestroy t_0, ExplDestroy t_1, ExplDestroy t_2, ExplDestroy t_3, ExplDestroy t_4) => ExplDestroy (t_0, t_1, t_2, t_3, t_4) # | |
Defined in Apecs.Core Methods explDestroy :: (t_0, t_1, t_2, t_3, t_4) -> Int -> IO () # | |
| (ExplDestroy t_0, ExplDestroy t_1, ExplDestroy t_2, ExplDestroy t_3, ExplDestroy t_4, ExplDestroy t_5) => ExplDestroy (t_0, t_1, t_2, t_3, t_4, t_5) # | |
Defined in Apecs.Core Methods explDestroy :: (t_0, t_1, t_2, t_3, t_4, t_5) -> Int -> IO () # | |
| (ExplDestroy t_0, ExplDestroy t_1, ExplDestroy t_2, ExplDestroy t_3, ExplDestroy t_4, ExplDestroy t_5, ExplDestroy t_6) => ExplDestroy (t_0, t_1, t_2, t_3, t_4, t_5, t_6) # | |
Defined in Apecs.Core Methods explDestroy :: (t_0, t_1, t_2, t_3, t_4, t_5, t_6) -> Int -> IO () # | |
| (ExplDestroy t_0, ExplDestroy t_1, ExplDestroy t_2, ExplDestroy t_3, ExplDestroy t_4, ExplDestroy t_5, ExplDestroy t_6, ExplDestroy t_7) => ExplDestroy (t_0, t_1, t_2, t_3, t_4, t_5, t_6, t_7) # | |
Defined in Apecs.Core Methods explDestroy :: (t_0, t_1, t_2, t_3, t_4, t_5, t_6, t_7) -> Int -> IO () # | |
class ExplMembers s where #
Stores that we can request a list of member entities for.
Minimal complete definition
Instances
| ExplMembers s => ExplMembers (Identity s) # | |
Defined in Apecs.Core | |
| ExplMembers s => ExplMembers (FilterStore s) # | |
Defined in Apecs.Core Methods explMembers :: FilterStore s -> IO (Vector Int) # | |
| ExplMembers (Unique c) # | |
Defined in Apecs.Stores | |
| ExplMembers (Map c) # | |
Defined in Apecs.Stores | |
| (ExplMembers t_0, ExplGet t_1) => ExplMembers (t_0, t_1) # | |
Defined in Apecs.Core Methods explMembers :: (t_0, t_1) -> IO (Vector Int) # | |
| ExplMembers s => ExplMembers (Cache n s) # | |
Defined in Apecs.Stores | |
| (ExplMembers t_0, ExplGet t_1, ExplGet t_2) => ExplMembers (t_0, t_1, t_2) # | |
Defined in Apecs.Core Methods explMembers :: (t_0, t_1, t_2) -> IO (Vector Int) # | |
| (ExplMembers t_0, ExplGet t_1, ExplGet t_2, ExplGet t_3) => ExplMembers (t_0, t_1, t_2, t_3) # | |
Defined in Apecs.Core Methods explMembers :: (t_0, t_1, t_2, t_3) -> IO (Vector Int) # | |
| (ExplMembers t_0, ExplGet t_1, ExplGet t_2, ExplGet t_3, ExplGet t_4) => ExplMembers (t_0, t_1, t_2, t_3, t_4) # | |
Defined in Apecs.Core Methods explMembers :: (t_0, t_1, t_2, t_3, t_4) -> IO (Vector Int) # | |
| (ExplMembers t_0, ExplGet t_1, ExplGet t_2, ExplGet t_3, ExplGet t_4, ExplGet t_5) => ExplMembers (t_0, t_1, t_2, t_3, t_4, t_5) # | |
Defined in Apecs.Core Methods explMembers :: (t_0, t_1, t_2, t_3, t_4, t_5) -> IO (Vector Int) # | |
| (ExplMembers t_0, ExplGet t_1, ExplGet t_2, ExplGet t_3, ExplGet t_4, ExplGet t_5, ExplGet t_6) => ExplMembers (t_0, t_1, t_2, t_3, t_4, t_5, t_6) # | |
Defined in Apecs.Core Methods explMembers :: (t_0, t_1, t_2, t_3, t_4, t_5, t_6) -> IO (Vector Int) # | |
| (ExplMembers t_0, ExplGet t_1, ExplGet t_2, ExplGet t_3, ExplGet t_4, ExplGet t_5, ExplGet t_6, ExplGet t_7) => ExplMembers (t_0, t_1, t_2, t_3, t_4, t_5, t_6, t_7) # | |
Defined in Apecs.Core Methods explMembers :: (t_0, t_1, t_2, t_3, t_4, t_5, t_6, t_7) -> IO (Vector Int) # | |
type Members w c = (Has w c, ExplMembers (Storage c)) #
type Destroy w c = (Has w c, ExplDestroy (Storage c)) #
Psuedocomponent indicating the absence of a.
Mainly used as e.g. cmap $ (a, Not b) -> c to iterate over entities with an a but no b.
Can also be used to delete components, like cmap $ a -> (Not :: Not a) to delete every a component.
Constructors
| Not |
Pseudostore used to produce values of type Not a, inverts explExists, and destroys instead of explSet.
Constructors
| NotStore s |
newtype MaybeStore s #
Pseudostore used to produce values of type Maybe a.
Will always return True for explExists.
Writing can both set and delete a component using Just and Nothing respectively.
Constructors
| MaybeStore s |
Instances
| (ExplDestroy s, ExplSet s) => ExplSet (MaybeStore s) # | |
Defined in Apecs.Core Methods explSet :: MaybeStore s -> Int -> Elem (MaybeStore s) -> IO () # | |
| ExplGet s => ExplGet (MaybeStore s) # | |
Defined in Apecs.Core Methods explGet :: MaybeStore s -> Int -> IO (Elem (MaybeStore s)) # explExists :: MaybeStore s -> Int -> IO Bool # | |
| type Elem (MaybeStore s) # | |
Defined in Apecs.Core | |
data EitherStore sa sb #
Used for Either, a logical disjunction between two components.
As expected, Either is used to model error values.
Getting an Either a b will first attempt to get a b and return it as Right b, or if it does not exist, get an a as Left a.
Can also be used to set one of two things.
Constructors
| EitherStore sa sb |
Instances
| (ExplSet sa, ExplSet sb) => ExplSet (EitherStore sa sb) # | |
Defined in Apecs.Core Methods explSet :: EitherStore sa sb -> Int -> Elem (EitherStore sa sb) -> IO () # | |
| (ExplGet sa, ExplGet sb) => ExplGet (EitherStore sa sb) # | |
Defined in Apecs.Core Methods explGet :: EitherStore sa sb -> Int -> IO (Elem (EitherStore sa sb)) # explExists :: EitherStore sa sb -> Int -> IO Bool # | |
| type Elem (EitherStore sa sb) # | |
Defined in Apecs.Core | |
Pseudocomponent that functions normally for explExists and explMembers, but always return Filter for explGet.
Can be used in cmap as cmap $ (Filter :: Filter a) -> b.
Since the above can be written more consicely as cmap $ (_ :: a) -> b, it is rarely directly.
More interestingly, we can define reusable filters like movables = Filter :: Filter (Position, Velocity).
Constructors
| Filter |
newtype FilterStore s #
Constructors
| FilterStore s |
Instances
| ExplMembers s => ExplMembers (FilterStore s) # | |
Defined in Apecs.Core Methods explMembers :: FilterStore s -> IO (Vector Int) # | |
| ExplGet s => ExplGet (FilterStore s) # | |
Defined in Apecs.Core Methods explGet :: FilterStore s -> Int -> IO (Elem (FilterStore s)) # explExists :: FilterStore s -> Int -> IO Bool # | |
| type Elem (FilterStore s) # | |
Defined in Apecs.Core | |
data EntityStore #
Pseudostore used to produce components of type Entity.
Always returns True for explExists, and echoes back the entity argument for explGet.
Used in e.g. cmap $ (a, ety :: Entity) -> b to access the current entity.
Constructors
| EntityStore |
Instances
| ExplGet EntityStore # | |
Defined in Apecs.Core Methods explGet :: EntityStore -> Int -> IO (Elem EntityStore) # explExists :: EntityStore -> Int -> IO Bool # | |
| type Elem EntityStore # | |
Defined in Apecs.Core | |