{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE RankNTypes #-}
module Aztecs.ECS.World.Observers.Internal
( ObserverID (..),
Observers (..),
EntityObservers (..),
DynamicObserver (..),
)
where
import Aztecs.ECS.Entity
import Data.Dynamic
import Data.Map.Strict (Map)
import Data.Set (Set)
import Data.Typeable
import GHC.Generics
newtype ObserverID = ObserverID
{
ObserverID -> Int
unObserverId :: Int
}
deriving (ObserverID -> ObserverID -> Bool
(ObserverID -> ObserverID -> Bool)
-> (ObserverID -> ObserverID -> Bool) -> Eq ObserverID
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ObserverID -> ObserverID -> Bool
== :: ObserverID -> ObserverID -> Bool
$c/= :: ObserverID -> ObserverID -> Bool
/= :: ObserverID -> ObserverID -> Bool
Eq, Eq ObserverID
Eq ObserverID =>
(ObserverID -> ObserverID -> Ordering)
-> (ObserverID -> ObserverID -> Bool)
-> (ObserverID -> ObserverID -> Bool)
-> (ObserverID -> ObserverID -> Bool)
-> (ObserverID -> ObserverID -> Bool)
-> (ObserverID -> ObserverID -> ObserverID)
-> (ObserverID -> ObserverID -> ObserverID)
-> Ord ObserverID
ObserverID -> ObserverID -> Bool
ObserverID -> ObserverID -> Ordering
ObserverID -> ObserverID -> ObserverID
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: ObserverID -> ObserverID -> Ordering
compare :: ObserverID -> ObserverID -> Ordering
$c< :: ObserverID -> ObserverID -> Bool
< :: ObserverID -> ObserverID -> Bool
$c<= :: ObserverID -> ObserverID -> Bool
<= :: ObserverID -> ObserverID -> Bool
$c> :: ObserverID -> ObserverID -> Bool
> :: ObserverID -> ObserverID -> Bool
$c>= :: ObserverID -> ObserverID -> Bool
>= :: ObserverID -> ObserverID -> Bool
$cmax :: ObserverID -> ObserverID -> ObserverID
max :: ObserverID -> ObserverID -> ObserverID
$cmin :: ObserverID -> ObserverID -> ObserverID
min :: ObserverID -> ObserverID -> ObserverID
Ord, Int -> ObserverID -> ShowS
[ObserverID] -> ShowS
ObserverID -> String
(Int -> ObserverID -> ShowS)
-> (ObserverID -> String)
-> ([ObserverID] -> ShowS)
-> Show ObserverID
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ObserverID -> ShowS
showsPrec :: Int -> ObserverID -> ShowS
$cshow :: ObserverID -> String
show :: ObserverID -> String
$cshowList :: [ObserverID] -> ShowS
showList :: [ObserverID] -> ShowS
Show, (forall x. ObserverID -> Rep ObserverID x)
-> (forall x. Rep ObserverID x -> ObserverID) -> Generic ObserverID
forall x. Rep ObserverID x -> ObserverID
forall x. ObserverID -> Rep ObserverID x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ObserverID -> Rep ObserverID x
from :: forall x. ObserverID -> Rep ObserverID x
$cto :: forall x. Rep ObserverID x -> ObserverID
to :: forall x. Rep ObserverID x -> ObserverID
Generic)
data DynamicObserver m
=
DynEntityObserver !(EntityID -> Dynamic -> m ())
|
DynEventObserver !(Dynamic -> m ())
newtype EntityObservers = EntityObservers {EntityObservers -> Map TypeRep (Set ObserverID)
eventObservers :: Map TypeRep (Set ObserverID)}
deriving (Int -> EntityObservers -> ShowS
[EntityObservers] -> ShowS
EntityObservers -> String
(Int -> EntityObservers -> ShowS)
-> (EntityObservers -> String)
-> ([EntityObservers] -> ShowS)
-> Show EntityObservers
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> EntityObservers -> ShowS
showsPrec :: Int -> EntityObservers -> ShowS
$cshow :: EntityObservers -> String
show :: EntityObservers -> String
$cshowList :: [EntityObservers] -> ShowS
showList :: [EntityObservers] -> ShowS
Show, (forall x. EntityObservers -> Rep EntityObservers x)
-> (forall x. Rep EntityObservers x -> EntityObservers)
-> Generic EntityObservers
forall x. Rep EntityObservers x -> EntityObservers
forall x. EntityObservers -> Rep EntityObservers x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. EntityObservers -> Rep EntityObservers x
from :: forall x. EntityObservers -> Rep EntityObservers x
$cto :: forall x. Rep EntityObservers x -> EntityObservers
to :: forall x. Rep EntityObservers x -> EntityObservers
Generic, NonEmpty EntityObservers -> EntityObservers
EntityObservers -> EntityObservers -> EntityObservers
(EntityObservers -> EntityObservers -> EntityObservers)
-> (NonEmpty EntityObservers -> EntityObservers)
-> (forall b.
Integral b =>
b -> EntityObservers -> EntityObservers)
-> Semigroup EntityObservers
forall b. Integral b => b -> EntityObservers -> EntityObservers
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
$c<> :: EntityObservers -> EntityObservers -> EntityObservers
<> :: EntityObservers -> EntityObservers -> EntityObservers
$csconcat :: NonEmpty EntityObservers -> EntityObservers
sconcat :: NonEmpty EntityObservers -> EntityObservers
$cstimes :: forall b. Integral b => b -> EntityObservers -> EntityObservers
stimes :: forall b. Integral b => b -> EntityObservers -> EntityObservers
Semigroup, Semigroup EntityObservers
EntityObservers
Semigroup EntityObservers =>
EntityObservers
-> (EntityObservers -> EntityObservers -> EntityObservers)
-> ([EntityObservers] -> EntityObservers)
-> Monoid EntityObservers
[EntityObservers] -> EntityObservers
EntityObservers -> EntityObservers -> EntityObservers
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
$cmempty :: EntityObservers
mempty :: EntityObservers
$cmappend :: EntityObservers -> EntityObservers -> EntityObservers
mappend :: EntityObservers -> EntityObservers -> EntityObservers
$cmconcat :: [EntityObservers] -> EntityObservers
mconcat :: [EntityObservers] -> EntityObservers
Monoid)
data Observers m = Observers
{ forall (m :: * -> *). Observers m -> Map EntityID EntityObservers
entityObservers' :: !(Map EntityID EntityObservers),
forall (m :: * -> *). Observers m -> Map TypeRep (Set ObserverID)
globalObservers :: !(Map TypeRep (Set ObserverID)),
forall (m :: * -> *).
Observers m -> Map ObserverID (DynamicObserver m)
observerCallbacks :: !(Map ObserverID (DynamicObserver m)),
forall (m :: * -> *). Observers m -> ObserverID
nextObserverId :: !ObserverID
}