packages feed

mischief-ecs-0.2.0.0: src/Mischief/ECS/Events.hs

module Mischief.ECS.Events where

import Data.Foldable (for_)
import Mischief.ECS.Entities
import Mischief.ECS.EventDef
import Mischief.ECS.Observer
import Mischief.ECS.World
import Mischief.ECS.World.Query
import Mischief.ECS.World.Query.Markers

trigger :: forall e. (Event e) => e -> System ()
trigger !event = do
  !observers <- query $ mkQuery (C @(Observer e), C @(EventProxy e))
  for_ observers $ \(!observer, _) -> do
    let Observer !f = observer
    f event

newtype OnSet c = OnSet {entity :: Entity}
  deriving anyclass (Event)
  deriving stock (Show)

data OnSetRel c = OnSetRel {entity :: Entity, target :: Entity}
  deriving anyclass (Event)
  deriving stock (Show)

newtype OnAdd c = OnAdd {entity :: Entity}
  deriving anyclass (Event)
  deriving stock (Show)

data OnAddRel c = OnAddRel {entity :: Entity, target :: Entity}
  deriving anyclass (Event)
  deriving stock (Show)

newtype OnRemove c = OnRemove {entity :: Entity}
  deriving anyclass (Event)
  deriving stock (Show)

data OnRemoveRel c = OnRemoveRel {entity :: Entity, target :: Entity}
  deriving anyclass (Event)
  deriving stock (Show)