module Mischief.ECS.Observer where

import Data.Data
import Data.Default
import GHC.Generics
import Mischief.ECS.Components
import Mischief.ECS.Components.Required
import Mischief.ECS.World

newtype Observer e = Observer (e -> System ())

instance (Typeable e) => Component (Observer e) where
  required :: Set DefaultComponentType
required = forall b. RequiredBundle b => Set DefaultComponentType
forall {k} (b :: k). RequiredBundle b => Set DefaultComponentType
require @(EventProxy e, ObserverOrder)

newtype ObserverOrder = ObserverOrder Int
  deriving (Int -> ObserverOrder -> ShowS
[ObserverOrder] -> ShowS
ObserverOrder -> String
(Int -> ObserverOrder -> ShowS)
-> (ObserverOrder -> String)
-> ([ObserverOrder] -> ShowS)
-> Show ObserverOrder
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ObserverOrder -> ShowS
showsPrec :: Int -> ObserverOrder -> ShowS
$cshow :: ObserverOrder -> String
show :: ObserverOrder -> String
$cshowList :: [ObserverOrder] -> ShowS
showList :: [ObserverOrder] -> ShowS
Show)
  deriving anyclass (Typeable ObserverOrder
Set DefaultComponentType
Hooks ObserverOrder
IsExclusive (RelExclusivity ObserverOrder)
(Typeable ObserverOrder,
 IsExclusive (RelExclusivity ObserverOrder)) =>
Set DefaultComponentType
-> Hooks ObserverOrder -> Component ObserverOrder
forall c.
(Typeable c, IsExclusive (RelExclusivity c)) =>
Set DefaultComponentType -> Hooks c -> Component c
$crequired :: Set DefaultComponentType
required :: Set DefaultComponentType
$chooks :: Hooks ObserverOrder
hooks :: Hooks ObserverOrder
Component)
  deriving newtype (ObserverOrder -> ObserverOrder -> Bool
(ObserverOrder -> ObserverOrder -> Bool)
-> (ObserverOrder -> ObserverOrder -> Bool) -> Eq ObserverOrder
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ObserverOrder -> ObserverOrder -> Bool
== :: ObserverOrder -> ObserverOrder -> Bool
$c/= :: ObserverOrder -> ObserverOrder -> Bool
/= :: ObserverOrder -> ObserverOrder -> Bool
Eq, Eq ObserverOrder
Eq ObserverOrder =>
(ObserverOrder -> ObserverOrder -> Ordering)
-> (ObserverOrder -> ObserverOrder -> Bool)
-> (ObserverOrder -> ObserverOrder -> Bool)
-> (ObserverOrder -> ObserverOrder -> Bool)
-> (ObserverOrder -> ObserverOrder -> Bool)
-> (ObserverOrder -> ObserverOrder -> ObserverOrder)
-> (ObserverOrder -> ObserverOrder -> ObserverOrder)
-> Ord ObserverOrder
ObserverOrder -> ObserverOrder -> Bool
ObserverOrder -> ObserverOrder -> Ordering
ObserverOrder -> ObserverOrder -> ObserverOrder
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 :: ObserverOrder -> ObserverOrder -> Ordering
compare :: ObserverOrder -> ObserverOrder -> Ordering
$c< :: ObserverOrder -> ObserverOrder -> Bool
< :: ObserverOrder -> ObserverOrder -> Bool
$c<= :: ObserverOrder -> ObserverOrder -> Bool
<= :: ObserverOrder -> ObserverOrder -> Bool
$c> :: ObserverOrder -> ObserverOrder -> Bool
> :: ObserverOrder -> ObserverOrder -> Bool
$c>= :: ObserverOrder -> ObserverOrder -> Bool
>= :: ObserverOrder -> ObserverOrder -> Bool
$cmax :: ObserverOrder -> ObserverOrder -> ObserverOrder
max :: ObserverOrder -> ObserverOrder -> ObserverOrder
$cmin :: ObserverOrder -> ObserverOrder -> ObserverOrder
min :: ObserverOrder -> ObserverOrder -> ObserverOrder
Ord, ObserverOrder
ObserverOrder -> Default ObserverOrder
forall a. a -> Default a
$cdef :: ObserverOrder
def :: ObserverOrder
Default)

data EventProxy e = EventProxy deriving (Typeable (EventProxy e)
Set DefaultComponentType
Hooks (EventProxy e)
IsExclusive (RelExclusivity (EventProxy e))
(Typeable (EventProxy e),
 IsExclusive (RelExclusivity (EventProxy e))) =>
Set DefaultComponentType
-> Hooks (EventProxy e) -> Component (EventProxy e)
forall c.
(Typeable c, IsExclusive (RelExclusivity c)) =>
Set DefaultComponentType -> Hooks c -> Component c
forall k (e :: k).
(Typeable e, Typeable k) =>
Typeable (EventProxy e)
forall k (e :: k).
(Typeable e, Typeable k) =>
Set DefaultComponentType
forall k (e :: k). (Typeable e, Typeable k) => Hooks (EventProxy e)
forall k (e :: k).
(Typeable e, Typeable k) =>
IsExclusive (RelExclusivity (EventProxy e))
$crequired :: forall k (e :: k).
(Typeable e, Typeable k) =>
Set DefaultComponentType
required :: Set DefaultComponentType
$chooks :: forall k (e :: k). (Typeable e, Typeable k) => Hooks (EventProxy e)
hooks :: Hooks (EventProxy e)
Component, (forall x. EventProxy e -> Rep (EventProxy e) x)
-> (forall x. Rep (EventProxy e) x -> EventProxy e)
-> Generic (EventProxy e)
forall x. Rep (EventProxy e) x -> EventProxy e
forall x. EventProxy e -> Rep (EventProxy e) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall k (e :: k) x. Rep (EventProxy e) x -> EventProxy e
forall k (e :: k) x. EventProxy e -> Rep (EventProxy e) x
$cfrom :: forall k (e :: k) x. EventProxy e -> Rep (EventProxy e) x
from :: forall x. EventProxy e -> Rep (EventProxy e) x
$cto :: forall k (e :: k) x. Rep (EventProxy e) x -> EventProxy e
to :: forall x. Rep (EventProxy e) x -> EventProxy e
Generic, EventProxy e
EventProxy e -> Default (EventProxy e)
forall a. a -> Default a
forall k (e :: k). EventProxy e
$cdef :: forall k (e :: k). EventProxy e
def :: EventProxy e
Default)