{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}

-- |

-- Module      : Aztecs.ECS.Event

-- Copyright   : (c) Matt Hunzinger, 2025

-- License     : BSD-style (see the LICENSE file in the distribution)

--

-- Maintainer  : matt@hunzinger.me

-- Stability   : provisional

-- Portability : non-portable (GHC extensions)

module Aztecs.ECS.Event
  ( Event,
    OnInsert (..),
    OnChange (..),
    OnRemove (..),
  )
where

import Data.Typeable
import GHC.Generics

-- | An event in the ECS.

class (Typeable e) => Event e

-- | Event triggered when a component is inserted.

newtype OnInsert a = OnInsert {forall a. OnInsert a -> a
unOnInsert :: a}
  deriving (Int -> OnInsert a -> ShowS
[OnInsert a] -> ShowS
OnInsert a -> String
(Int -> OnInsert a -> ShowS)
-> (OnInsert a -> String)
-> ([OnInsert a] -> ShowS)
-> Show (OnInsert a)
forall a. Show a => Int -> OnInsert a -> ShowS
forall a. Show a => [OnInsert a] -> ShowS
forall a. Show a => OnInsert a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> OnInsert a -> ShowS
showsPrec :: Int -> OnInsert a -> ShowS
$cshow :: forall a. Show a => OnInsert a -> String
show :: OnInsert a -> String
$cshowList :: forall a. Show a => [OnInsert a] -> ShowS
showList :: [OnInsert a] -> ShowS
Show, OnInsert a -> OnInsert a -> Bool
(OnInsert a -> OnInsert a -> Bool)
-> (OnInsert a -> OnInsert a -> Bool) -> Eq (OnInsert a)
forall a. Eq a => OnInsert a -> OnInsert a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => OnInsert a -> OnInsert a -> Bool
== :: OnInsert a -> OnInsert a -> Bool
$c/= :: forall a. Eq a => OnInsert a -> OnInsert a -> Bool
/= :: OnInsert a -> OnInsert a -> Bool
Eq, (forall x. OnInsert a -> Rep (OnInsert a) x)
-> (forall x. Rep (OnInsert a) x -> OnInsert a)
-> Generic (OnInsert a)
forall x. Rep (OnInsert a) x -> OnInsert a
forall x. OnInsert a -> Rep (OnInsert a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (OnInsert a) x -> OnInsert a
forall a x. OnInsert a -> Rep (OnInsert a) x
$cfrom :: forall a x. OnInsert a -> Rep (OnInsert a) x
from :: forall x. OnInsert a -> Rep (OnInsert a) x
$cto :: forall a x. Rep (OnInsert a) x -> OnInsert a
to :: forall x. Rep (OnInsert a) x -> OnInsert a
Generic)

instance (Typeable a) => Event (OnInsert a)

-- | Event triggered when a component is changed.

newtype OnChange a = OnChange {forall a. OnChange a -> a
unOnChange :: a}
  deriving (Int -> OnChange a -> ShowS
[OnChange a] -> ShowS
OnChange a -> String
(Int -> OnChange a -> ShowS)
-> (OnChange a -> String)
-> ([OnChange a] -> ShowS)
-> Show (OnChange a)
forall a. Show a => Int -> OnChange a -> ShowS
forall a. Show a => [OnChange a] -> ShowS
forall a. Show a => OnChange a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> OnChange a -> ShowS
showsPrec :: Int -> OnChange a -> ShowS
$cshow :: forall a. Show a => OnChange a -> String
show :: OnChange a -> String
$cshowList :: forall a. Show a => [OnChange a] -> ShowS
showList :: [OnChange a] -> ShowS
Show, OnChange a -> OnChange a -> Bool
(OnChange a -> OnChange a -> Bool)
-> (OnChange a -> OnChange a -> Bool) -> Eq (OnChange a)
forall a. Eq a => OnChange a -> OnChange a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => OnChange a -> OnChange a -> Bool
== :: OnChange a -> OnChange a -> Bool
$c/= :: forall a. Eq a => OnChange a -> OnChange a -> Bool
/= :: OnChange a -> OnChange a -> Bool
Eq, (forall x. OnChange a -> Rep (OnChange a) x)
-> (forall x. Rep (OnChange a) x -> OnChange a)
-> Generic (OnChange a)
forall x. Rep (OnChange a) x -> OnChange a
forall x. OnChange a -> Rep (OnChange a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (OnChange a) x -> OnChange a
forall a x. OnChange a -> Rep (OnChange a) x
$cfrom :: forall a x. OnChange a -> Rep (OnChange a) x
from :: forall x. OnChange a -> Rep (OnChange a) x
$cto :: forall a x. Rep (OnChange a) x -> OnChange a
to :: forall x. Rep (OnChange a) x -> OnChange a
Generic)

instance (Typeable a) => Event (OnChange a)

-- | Event triggered when a component is removed.

newtype OnRemove a = OnRemove {forall a. OnRemove a -> a
unOnRemove :: a}
  deriving (Int -> OnRemove a -> ShowS
[OnRemove a] -> ShowS
OnRemove a -> String
(Int -> OnRemove a -> ShowS)
-> (OnRemove a -> String)
-> ([OnRemove a] -> ShowS)
-> Show (OnRemove a)
forall a. Show a => Int -> OnRemove a -> ShowS
forall a. Show a => [OnRemove a] -> ShowS
forall a. Show a => OnRemove a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> OnRemove a -> ShowS
showsPrec :: Int -> OnRemove a -> ShowS
$cshow :: forall a. Show a => OnRemove a -> String
show :: OnRemove a -> String
$cshowList :: forall a. Show a => [OnRemove a] -> ShowS
showList :: [OnRemove a] -> ShowS
Show, OnRemove a -> OnRemove a -> Bool
(OnRemove a -> OnRemove a -> Bool)
-> (OnRemove a -> OnRemove a -> Bool) -> Eq (OnRemove a)
forall a. Eq a => OnRemove a -> OnRemove a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => OnRemove a -> OnRemove a -> Bool
== :: OnRemove a -> OnRemove a -> Bool
$c/= :: forall a. Eq a => OnRemove a -> OnRemove a -> Bool
/= :: OnRemove a -> OnRemove a -> Bool
Eq, (forall x. OnRemove a -> Rep (OnRemove a) x)
-> (forall x. Rep (OnRemove a) x -> OnRemove a)
-> Generic (OnRemove a)
forall x. Rep (OnRemove a) x -> OnRemove a
forall x. OnRemove a -> Rep (OnRemove a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (OnRemove a) x -> OnRemove a
forall a x. OnRemove a -> Rep (OnRemove a) x
$cfrom :: forall a x. OnRemove a -> Rep (OnRemove a) x
from :: forall x. OnRemove a -> Rep (OnRemove a) x
$cto :: forall a x. Rep (OnRemove a) x -> OnRemove a
to :: forall x. Rep (OnRemove a) x -> OnRemove a
Generic)

instance (Typeable a) => Event (OnRemove a)