| Safe Haskell | None | 
|---|---|
| Language | Haskell2010 | 
Apecs.Core
Synopsis
- newtype Entity = Entity {}
 - newtype SystemT w m a = SystemT {}
 - type System w a = SystemT w IO a
 - class Elem (Storage c) ~ c => Component c where
- type Storage c
 
 - class (Monad m, Component c) => Has w m c where
 - type family Elem s
 - class ExplInit s where
 - class Monad m => ExplGet m s where
 - class Monad m => ExplSet m s where
 - class Monad m => ExplDestroy m s where
 - class Monad m => ExplMembers m s where
 - type Get w m c = (Has w m c, ExplGet m (Storage c))
 - type Set w m c = (Has w m c, ExplSet m (Storage c))
 - type Members w m c = (Has w m c, ExplMembers m (Storage c))
 - type Destroy w m c = (Has w m c, ExplDestroy m (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.
newtype SystemT w m a Source #
A SystemT 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. 
Instances
| Monad m => MonadReader w (SystemT w m) Source # | |
| MonadTrans (SystemT w) Source # | |
Defined in Apecs.Core  | |
| Monad m => Monad (SystemT w m) Source # | |
| Functor m => Functor (SystemT w m) Source # | |
| Applicative m => Applicative (SystemT w m) Source # | |
Defined in Apecs.Core  | |
| MonadIO m => MonadIO (SystemT w m) Source # | |
Defined in Apecs.Core  | |
class Elem (Storage c) ~ c => Component c Source #
A component is defined by specifying how it is stored. The constraint ensures that stores and components are mapped one-to-one.
Instances
class (Monad m, Component c) => Has w m c where Source #
Has w m c means that world w can produce a Storage c.
Minimal complete definition
Instances
| Monad m => Has w m Entity Source # | |
| Monad m => Has w m () Source # | |
| Has w m c => Has w m (Identity c) Source # | |
| Has w m c => Has w m (Filter c) Source # | |
| Has w m c => Has w m (Maybe c) Source # | |
| Has w m c => Has w m (Not c) Source # | |
| (Has w m ca, Has w m cb) => Has w m (Either ca cb) Source # | |
| (Has w m t_0, Has w m t_1) => Has w m (t_0, t_1) Source # | |
| (Has w m t_0, Has w m t_1, Has w m t_2) => Has w m (t_0, t_1, t_2) Source # | |
| (Has w m t_0, Has w m t_1, Has w m t_2, Has w m t_3) => Has w m (t_0, t_1, t_2, t_3) Source # | |
| (Has w m t_0, Has w m t_1, Has w m t_2, Has w m t_3, Has w m t_4) => Has w m (t_0, t_1, t_2, t_3, t_4) Source # | |
| (Has w m t_0, Has w m t_1, Has w m t_2, Has w m t_3, Has w m t_4, Has w m t_5) => Has w m (t_0, t_1, t_2, t_3, t_4, t_5) Source # | |
| (Has w m t_0, Has w m t_1, Has w m t_2, Has w m t_3, Has w m t_4, Has w m t_5, Has w m t_6) => Has w m (t_0, t_1, t_2, t_3, t_4, t_5, t_6) Source # | |
| (Has w m t_0, Has w m t_1, Has w m t_2, Has w m t_3, Has w m t_4, Has w m t_5, Has w m t_6, Has w m t_7) => Has w m (t_0, t_1, t_2, t_3, t_4, t_5, t_6, t_7) Source # | |
The type of components stored by a store, e.g. Elem (Map c) = c.
Instances
| type Elem () Source # | |
Defined in Apecs.Core type Elem () = ()  | |
| type Elem EntityStore Source # | |
Defined in Apecs.Core  | |
| type Elem (Identity s) Source # | |
Defined in Apecs.Core  | |
| type Elem (FilterStore s) Source # | |
Defined in Apecs.Core  | |
| type Elem (MaybeStore s) Source # | |
Defined in Apecs.Core  | |
| type Elem (NotStore s) Source # | |
Defined in Apecs.Core  | |
| type Elem (RawGlobal c) Source # | |
Defined in Apecs.Stores  | |
| type Elem (Global c) Source # | |
Defined in Apecs.Stores  | |
| type Elem (Unique c) Source # | |
Defined in Apecs.Stores  | |
| type Elem (Map c) Source # | |
Defined in Apecs.Stores  | |
| type Elem (t_0, t_1) Source # | |
Defined in Apecs.Core  | |
| type Elem (EitherStore sa sb) Source # | |
Defined in Apecs.Core  | |
| type Elem (Cache n s) Source # | |
Defined in Apecs.Stores  | |
| type Elem (t_0, t_1, t_2) Source # | |
Defined in Apecs.Core  | |
| type Elem (t_0, t_1, t_2, t_3) Source # | |
| type Elem (t_0, t_1, t_2, t_3, t_4) Source # | |
| type Elem (t_0, t_1, t_2, t_3, t_4, t_5) Source # | |
| type Elem (t_0, t_1, t_2, t_3, t_4, t_5, t_6) Source # | |
| type Elem (t_0, t_1, t_2, t_3, t_4, t_5, t_6, t_7) Source # | |
class ExplInit s where Source #
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
class Monad m => ExplGet m s where Source #
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 -> m (Elem s) Source #
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 -> m Bool Source #
Returns whether there is a component for the given index.
Instances
class Monad m => ExplSet m s where Source #
Stores that can be written.
Minimal complete definition
Instances
| Monad m => ExplSet m () Source # | |
| ExplSet IO (RawGlobal c) Source # | |
| ExplSet IO (Global c) Source # | |
| ExplSet IO (Unique c) Source # | |
| ExplSet IO (Map c) Source # | |
| ExplSet m s => ExplSet m (Identity s) Source # | |
| (ExplDestroy m s, ExplSet m s) => ExplSet m (MaybeStore s) Source # | |
Defined in Apecs.Core Methods explSet :: MaybeStore s -> Int -> Elem (MaybeStore s) -> m () Source #  | |
| ExplDestroy m s => ExplSet m (NotStore s) Source # | |
| ExplSet STM (Global c) Source # | |
| ExplSet STM (Unique c) Source # | |
| ExplSet STM (Map c) Source # | |
| ExplSet IO s => ExplSet IO (Cache n s) Source # | |
| (ExplSet m sa, ExplSet m sb) => ExplSet m (EitherStore sa sb) Source # | |
Defined in Apecs.Core Methods explSet :: EitherStore sa sb -> Int -> Elem (EitherStore sa sb) -> m () Source #  | |
| (ExplSet m t_0, ExplSet m t_1) => ExplSet m (t_0, t_1) Source # | |
| (ExplSet m t_0, ExplSet m t_1, ExplSet m t_2) => ExplSet m (t_0, t_1, t_2) Source # | |
| (ExplSet m t_0, ExplSet m t_1, ExplSet m t_2, ExplSet m t_3) => ExplSet m (t_0, t_1, t_2, t_3) Source # | |
| (ExplSet m t_0, ExplSet m t_1, ExplSet m t_2, ExplSet m t_3, ExplSet m t_4) => ExplSet m (t_0, t_1, t_2, t_3, t_4) Source # | |
| (ExplSet m t_0, ExplSet m t_1, ExplSet m t_2, ExplSet m t_3, ExplSet m t_4, ExplSet m t_5) => ExplSet m (t_0, t_1, t_2, t_3, t_4, t_5) Source # | |
| (ExplSet m t_0, ExplSet m t_1, ExplSet m t_2, ExplSet m t_3, ExplSet m t_4, ExplSet m t_5, ExplSet m t_6) => ExplSet m (t_0, t_1, t_2, t_3, t_4, t_5, t_6) Source # | |
| (ExplSet m t_0, ExplSet m t_1, ExplSet m t_2, ExplSet m t_3, ExplSet m t_4, ExplSet m t_5, ExplSet m t_6, ExplSet m t_7) => ExplSet m (t_0, t_1, t_2, t_3, t_4, t_5, t_6, t_7) Source # | |
class Monad m => ExplDestroy m s where Source #
Stores that components can be removed from.
Minimal complete definition
Instances
| Monad m => ExplDestroy m () Source # | |
Defined in Apecs.Core Methods explDestroy :: () -> Int -> m () Source #  | |
| ExplDestroy IO (Unique c) Source # | |
Defined in Apecs.Stores  | |
| ExplDestroy IO (Map c) Source # | |
Defined in Apecs.Stores  | |
| ExplDestroy m s => ExplDestroy m (Identity s) Source # | |
Defined in Apecs.Core Methods explDestroy :: Identity s -> Int -> m () Source #  | |
| ExplDestroy STM (Unique c) Source # | |
Defined in Apecs.Stores  | |
| ExplDestroy STM (Map c) Source # | |
Defined in Apecs.Stores  | |
| ExplDestroy IO s => ExplDestroy IO (Cache n s) Source # | |
Defined in Apecs.Stores  | |
| (ExplDestroy m sa, ExplDestroy m sb) => ExplDestroy m (EitherStore sa sb) Source # | |
Defined in Apecs.Core Methods explDestroy :: EitherStore sa sb -> Int -> m () Source #  | |
| (ExplDestroy m t_0, ExplDestroy m t_1) => ExplDestroy m (t_0, t_1) Source # | |
Defined in Apecs.Core Methods explDestroy :: (t_0, t_1) -> Int -> m () Source #  | |
| (ExplDestroy m t_0, ExplDestroy m t_1, ExplDestroy m t_2) => ExplDestroy m (t_0, t_1, t_2) Source # | |
Defined in Apecs.Core Methods explDestroy :: (t_0, t_1, t_2) -> Int -> m () Source #  | |
| (ExplDestroy m t_0, ExplDestroy m t_1, ExplDestroy m t_2, ExplDestroy m t_3) => ExplDestroy m (t_0, t_1, t_2, t_3) Source # | |
Defined in Apecs.Core Methods explDestroy :: (t_0, t_1, t_2, t_3) -> Int -> m () Source #  | |
| (ExplDestroy m t_0, ExplDestroy m t_1, ExplDestroy m t_2, ExplDestroy m t_3, ExplDestroy m t_4) => ExplDestroy m (t_0, t_1, t_2, t_3, t_4) Source # | |
Defined in Apecs.Core Methods explDestroy :: (t_0, t_1, t_2, t_3, t_4) -> Int -> m () Source #  | |
| (ExplDestroy m t_0, ExplDestroy m t_1, ExplDestroy m t_2, ExplDestroy m t_3, ExplDestroy m t_4, ExplDestroy m t_5) => ExplDestroy m (t_0, t_1, t_2, t_3, t_4, t_5) Source # | |
Defined in Apecs.Core Methods explDestroy :: (t_0, t_1, t_2, t_3, t_4, t_5) -> Int -> m () Source #  | |
| (ExplDestroy m t_0, ExplDestroy m t_1, ExplDestroy m t_2, ExplDestroy m t_3, ExplDestroy m t_4, ExplDestroy m t_5, ExplDestroy m t_6) => ExplDestroy m (t_0, t_1, t_2, t_3, t_4, t_5, t_6) Source # | |
Defined in Apecs.Core Methods explDestroy :: (t_0, t_1, t_2, t_3, t_4, t_5, t_6) -> Int -> m () Source #  | |
| (ExplDestroy m t_0, ExplDestroy m t_1, ExplDestroy m t_2, ExplDestroy m t_3, ExplDestroy m t_4, ExplDestroy m t_5, ExplDestroy m t_6, ExplDestroy m t_7) => ExplDestroy m (t_0, t_1, t_2, t_3, t_4, t_5, t_6, t_7) Source # | |
Defined in Apecs.Core Methods explDestroy :: (t_0, t_1, t_2, t_3, t_4, t_5, t_6, t_7) -> Int -> m () Source #  | |
class Monad m => ExplMembers m s where Source #
Stores that we can request a list of member entities for.
Minimal complete definition
Instances
| ExplMembers IO (Unique c) Source # | |
Defined in Apecs.Stores  | |
| ExplMembers IO (Map c) Source # | |
Defined in Apecs.Stores  | |
| ExplMembers m s => ExplMembers m (Identity s) Source # | |
Defined in Apecs.Core  | |
| ExplMembers m s => ExplMembers m (FilterStore s) Source # | |
Defined in Apecs.Core Methods explMembers :: FilterStore s -> m (Vector Int) Source #  | |
| ExplMembers STM (Unique c) Source # | |
Defined in Apecs.Stores  | |
| ExplMembers STM (Map c) Source # | |
Defined in Apecs.Stores  | |
| ExplMembers IO s => ExplMembers IO (Cache n s) Source # | |
Defined in Apecs.Stores  | |
| (ExplMembers m t_0, ExplGet m t_1) => ExplMembers m (t_0, t_1) Source # | |
Defined in Apecs.Core Methods explMembers :: (t_0, t_1) -> m (Vector Int) Source #  | |
| (ExplMembers m t_0, ExplGet m t_1, ExplGet m t_2) => ExplMembers m (t_0, t_1, t_2) Source # | |
Defined in Apecs.Core Methods explMembers :: (t_0, t_1, t_2) -> m (Vector Int) Source #  | |
| (ExplMembers m t_0, ExplGet m t_1, ExplGet m t_2, ExplGet m t_3) => ExplMembers m (t_0, t_1, t_2, t_3) Source # | |
Defined in Apecs.Core Methods explMembers :: (t_0, t_1, t_2, t_3) -> m (Vector Int) Source #  | |
| (ExplMembers m t_0, ExplGet m t_1, ExplGet m t_2, ExplGet m t_3, ExplGet m t_4) => ExplMembers m (t_0, t_1, t_2, t_3, t_4) Source # | |
Defined in Apecs.Core Methods explMembers :: (t_0, t_1, t_2, t_3, t_4) -> m (Vector Int) Source #  | |
| (ExplMembers m t_0, ExplGet m t_1, ExplGet m t_2, ExplGet m t_3, ExplGet m t_4, ExplGet m t_5) => ExplMembers m (t_0, t_1, t_2, t_3, t_4, t_5) Source # | |
Defined in Apecs.Core Methods explMembers :: (t_0, t_1, t_2, t_3, t_4, t_5) -> m (Vector Int) Source #  | |
| (ExplMembers m t_0, ExplGet m t_1, ExplGet m t_2, ExplGet m t_3, ExplGet m t_4, ExplGet m t_5, ExplGet m t_6) => ExplMembers m (t_0, t_1, t_2, t_3, t_4, t_5, t_6) Source # | |
Defined in Apecs.Core Methods explMembers :: (t_0, t_1, t_2, t_3, t_4, t_5, t_6) -> m (Vector Int) Source #  | |
| (ExplMembers m t_0, ExplGet m t_1, ExplGet m t_2, ExplGet m t_3, ExplGet m t_4, ExplGet m t_5, ExplGet m t_6, ExplGet m t_7) => ExplMembers m (t_0, t_1, t_2, t_3, t_4, t_5, t_6, t_7) Source # | |
Defined in Apecs.Core Methods explMembers :: (t_0, t_1, t_2, t_3, t_4, t_5, t_6, t_7) -> m (Vector Int) Source #  | |
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 Source #
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 m s, ExplSet m s) => ExplSet m (MaybeStore s) Source # | |
Defined in Apecs.Core Methods explSet :: MaybeStore s -> Int -> Elem (MaybeStore s) -> m () Source #  | |
| ExplGet m s => ExplGet m (MaybeStore s) Source # | |
Defined in Apecs.Core Methods explGet :: MaybeStore s -> Int -> m (Elem (MaybeStore s)) Source # explExists :: MaybeStore s -> Int -> m Bool Source #  | |
| type Elem (MaybeStore s) Source # | |
Defined in Apecs.Core  | |
data EitherStore sa sb Source #
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
| (ExplDestroy m sa, ExplDestroy m sb) => ExplDestroy m (EitherStore sa sb) Source # | |
Defined in Apecs.Core Methods explDestroy :: EitherStore sa sb -> Int -> m () Source #  | |
| (ExplSet m sa, ExplSet m sb) => ExplSet m (EitherStore sa sb) Source # | |
Defined in Apecs.Core Methods explSet :: EitherStore sa sb -> Int -> Elem (EitherStore sa sb) -> m () Source #  | |
| (ExplGet m sa, ExplGet m sb) => ExplGet m (EitherStore sa sb) Source # | |
Defined in Apecs.Core Methods explGet :: EitherStore sa sb -> Int -> m (Elem (EitherStore sa sb)) Source # explExists :: EitherStore sa sb -> Int -> m Bool Source #  | |
| type Elem (EitherStore sa sb) Source # | |
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 Source #
Constructors
| FilterStore s | 
Instances
| ExplMembers m s => ExplMembers m (FilterStore s) Source # | |
Defined in Apecs.Core Methods explMembers :: FilterStore s -> m (Vector Int) Source #  | |
| ExplGet m s => ExplGet m (FilterStore s) Source # | |
Defined in Apecs.Core Methods explGet :: FilterStore s -> Int -> m (Elem (FilterStore s)) Source # explExists :: FilterStore s -> Int -> m Bool Source #  | |
| type Elem (FilterStore s) Source # | |
Defined in Apecs.Core  | |
data EntityStore Source #
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
| Monad m => ExplGet m EntityStore Source # | |
Defined in Apecs.Core Methods explGet :: EntityStore -> Int -> m (Elem EntityStore) Source # explExists :: EntityStore -> Int -> m Bool Source #  | |
| type Elem EntityStore Source # | |
Defined in Apecs.Core  | |