Safe Haskell | None |
---|---|
Language | Haskell2010 |
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 m 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
.
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 (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 m 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.
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
.
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.
Instances
Monad m => ExplSet m () 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 explSet :: MaybeStore s -> Int -> Elem (MaybeStore s) -> m () Source # | |
ExplDestroy m s => ExplSet m (NotStore s) 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 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.
explDestroy :: s -> Int -> m () Source #
Destroys the component for a given index.
Instances
Monad m => ExplDestroy m () Source # | |
Defined in Apecs.Core 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 explDestroy :: Identity s -> Int -> m () Source # | |
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 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 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 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 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 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 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 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 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.
explMembers :: s -> m (Vector Int) Source #
Returns an unboxed vector of member indices
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 explMembers :: FilterStore s -> m (Vector Int) Source # | |
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 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 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 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 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 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 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 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.
Pseudostore used to produce values of type Not a
, inverts explExists
, and destroys instead of explSet
.
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.
Instances
(ExplDestroy m s, ExplSet m s) => ExplSet m (MaybeStore s) Source # | |
Defined in Apecs.Core explSet :: MaybeStore s -> Int -> Elem (MaybeStore s) -> m () Source # | |
ExplGet m s => ExplGet m (MaybeStore s) Source # | |
Defined in Apecs.Core 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.
EitherStore sa sb |
Instances
(ExplDestroy m sa, ExplDestroy m sb) => ExplDestroy m (EitherStore sa sb) Source # | |
Defined in Apecs.Core explDestroy :: EitherStore sa sb -> Int -> m () Source # | |
(ExplSet m sa, ExplSet m sb) => ExplSet m (EitherStore sa sb) Source # | |
Defined in Apecs.Core 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 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)
.
newtype FilterStore s Source #
Instances
ExplMembers m s => ExplMembers m (FilterStore s) Source # | |
Defined in Apecs.Core explMembers :: FilterStore s -> m (Vector Int) Source # | |
ExplGet m s => ExplGet m (FilterStore s) Source # | |
Defined in Apecs.Core 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.
Instances
Monad m => ExplGet m EntityStore Source # | |
Defined in Apecs.Core explGet :: EntityStore -> Int -> m (Elem EntityStore) Source # explExists :: EntityStore -> Int -> m Bool Source # | |
type Elem EntityStore Source # | |
Defined in Apecs.Core |