-- | Types for the client
module Calamity.Client.Types
    ( Client(..)
    , BotC
    , SetupEff
    , EHType
    , EventHandlers(..)
    , EventHandler(..)
    , InsertEventHandler(..)
    , GetEventHandlers(..)
    , EventType(..)
    , getCustomEventHandlers ) where

import           Calamity.Cache.Eff
import           Calamity.Gateway.DispatchEvents ( CalamityEvent(..), ReadyData )
import           Calamity.Gateway.Types          ( ControlMessage )
import           Calamity.HTTP.Internal.Types
import           Calamity.LogEff
import           Calamity.Metrics.Eff
import           Calamity.Types.Model.Channel
import           Calamity.Types.Model.Guild
import           Calamity.Types.Model.User
import           Calamity.Types.Token
import           Calamity.Types.UnixTimestamp

import           Control.Concurrent.Async
import           Control.Concurrent.Chan.Unagi
import           Control.Concurrent.MVar
import           Control.Concurrent.STM.TVar

import           Data.Default.Class
import           Data.Dynamic
import           Data.Functor
import qualified Data.HashMap.Lazy               as LH
import           Data.Maybe
import           Data.Time
import qualified Data.TypeRepMap                 as TM
import           Data.TypeRepMap                 ( TypeRepMap, WrapTypeable(..) )
import           Data.Typeable
import           Data.Void

import           GHC.Exts                        ( fromList )
import           GHC.Generics

import qualified Polysemy                        as P
import qualified Polysemy.Async                  as P
import qualified Polysemy.AtomicState            as P
import qualified Polysemy.Reader                 as P

data Client = Client
  { Client -> TVar [(InChan ControlMessage, Async (Maybe ()))]
shards        :: TVar [(InChan ControlMessage, Async (Maybe ()))]
  , Client -> MVar Int
numShards     :: MVar Int
  , Client -> Token
token         :: Token
  , Client -> RateLimitState
rlState       :: RateLimitState
  , Client -> InChan CalamityEvent
eventsIn      :: InChan CalamityEvent
  , Client -> OutChan CalamityEvent
eventsOut     :: OutChan CalamityEvent
  }
  deriving ( (forall x. Client -> Rep Client x)
-> (forall x. Rep Client x -> Client) -> Generic Client
forall x. Rep Client x -> Client
forall x. Client -> Rep Client x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Client x -> Client
$cfrom :: forall x. Client -> Rep Client x
Generic )

type BotC r =
  ( P.Members '[LogEff, MetricEff, CacheEff, P.Reader Client,
  P.AtomicState EventHandlers, P.Embed IO, P.Final IO, P.Async] r
  , Typeable r)

type SetupEff r = P.Sem (LogEff ': P.Reader Client ': P.AtomicState EventHandlers ': P.Async ': r) ()

-- | A Data Kind used to fire custom events
data EventType
  = ReadyEvt
  | ChannelCreateEvt
  | ChannelUpdateEvt
  | ChannelDeleteEvt
  | ChannelpinsUpdateEvt
  | GuildCreateEvt
  | GuildUpdateEvt
  | GuildDeleteEvt
  | GuildBanAddEvt
  | GuildBanRemoveEvt
  | GuildEmojisUpdateEvt
  | GuildIntegrationsUpdateEvt
  | GuildMemberAddEvt
  | GuildMemberRemoveEvt
  | GuildMemberUpdateEvt
  | GuildMembersChunkEvt
  | GuildRoleCreateEvt
  | GuildRoleUpdateEvt
  | GuildRoleDeleteEvt
  | MessageCreateEvt
  | MessageUpdateEvt
  | MessageDeleteEvt
  | MessageDeleteBulkEvt
  | MessageReactionAddEvt
  | MessageReactionRemoveEvt
  | MessageReactionRemoveAllEvt
  | TypingStartEvt
  | UserUpdateEvt
  | forall s a. CustomEvt s a

type family EHType (d :: EventType) m where
  EHType 'ReadyEvt                    m = ReadyData                                   -> m ()
  EHType 'ChannelCreateEvt            m = Channel                                     -> m ()
  EHType 'ChannelUpdateEvt            m = Channel   -> Channel                        -> m ()
  EHType 'ChannelDeleteEvt            m = Channel                                     -> m ()
  EHType 'ChannelpinsUpdateEvt        m = Channel   -> Maybe UTCTime                  -> m ()
  EHType 'GuildCreateEvt              m = Guild     -> Bool                           -> m ()
  EHType 'GuildUpdateEvt              m = Guild     -> Guild                          -> m ()
  EHType 'GuildDeleteEvt              m = Guild     -> Bool                           -> m ()
  EHType 'GuildBanAddEvt              m = Guild     -> User                           -> m ()
  EHType 'GuildBanRemoveEvt           m = Guild     -> User                           -> m ()
  EHType 'GuildEmojisUpdateEvt        m = Guild     -> [Emoji]                        -> m ()
  EHType 'GuildIntegrationsUpdateEvt  m = Guild                                       -> m ()
  EHType 'GuildMemberAddEvt           m = Member                                      -> m ()
  EHType 'GuildMemberRemoveEvt        m = Member                                      -> m ()
  EHType 'GuildMemberUpdateEvt        m = Member    -> Member                         -> m ()
  EHType 'GuildMembersChunkEvt        m = Guild     -> [Member]                       -> m ()
  EHType 'GuildRoleCreateEvt          m = Guild     -> Role                           -> m ()
  EHType 'GuildRoleUpdateEvt          m = Guild     -> Role          -> Role          -> m ()
  EHType 'GuildRoleDeleteEvt          m = Guild     -> Role                           -> m ()
  EHType 'MessageCreateEvt            m = Message                                     -> m ()
  EHType 'MessageUpdateEvt            m = Message   -> Message                        -> m ()
  EHType 'MessageDeleteEvt            m = Message                                     -> m ()
  EHType 'MessageDeleteBulkEvt        m = [Message]                                   -> m ()
  EHType 'MessageReactionAddEvt       m = Message   -> Reaction                       -> m ()
  EHType 'MessageReactionRemoveEvt    m = Message   -> Reaction                       -> m ()
  EHType 'MessageReactionRemoveAllEvt m = Message                                     -> m ()
  EHType 'TypingStartEvt              m = Channel   -> Maybe Member  -> UnixTimestamp -> m ()
  EHType 'UserUpdateEvt               m = User      -> User                           -> m ()
  EHType ('CustomEvt s a)             m = a                                           -> m ()

type family EHType' (d :: EventType) where
  EHType' 'ReadyEvt                    = Dynamic
  EHType' 'ChannelCreateEvt            = Dynamic
  EHType' 'ChannelUpdateEvt            = Dynamic
  EHType' 'ChannelDeleteEvt            = Dynamic
  EHType' 'ChannelpinsUpdateEvt        = Dynamic
  EHType' 'GuildCreateEvt              = Dynamic
  EHType' 'GuildUpdateEvt              = Dynamic
  EHType' 'GuildDeleteEvt              = Dynamic
  EHType' 'GuildBanAddEvt              = Dynamic
  EHType' 'GuildBanRemoveEvt           = Dynamic
  EHType' 'GuildEmojisUpdateEvt        = Dynamic
  EHType' 'GuildIntegrationsUpdateEvt  = Dynamic
  EHType' 'GuildMemberAddEvt           = Dynamic
  EHType' 'GuildMemberRemoveEvt        = Dynamic
  EHType' 'GuildMemberUpdateEvt        = Dynamic
  EHType' 'GuildMembersChunkEvt        = Dynamic
  EHType' 'GuildRoleCreateEvt          = Dynamic
  EHType' 'GuildRoleUpdateEvt          = Dynamic
  EHType' 'GuildRoleDeleteEvt          = Dynamic
  EHType' 'MessageCreateEvt            = Dynamic
  EHType' 'MessageUpdateEvt            = Dynamic
  EHType' 'MessageDeleteEvt            = Dynamic
  EHType' 'MessageDeleteBulkEvt        = Dynamic
  EHType' 'MessageReactionAddEvt       = Dynamic
  EHType' 'MessageReactionRemoveEvt    = Dynamic
  EHType' 'MessageReactionRemoveAllEvt = Dynamic
  EHType' 'TypingStartEvt              = Dynamic
  EHType' 'UserUpdateEvt               = Dynamic
  EHType' ('CustomEvt _ _)             = Dynamic

newtype EventHandlers = EventHandlers (TypeRepMap EventHandler)

type family EHStorageType t where
  EHStorageType ('CustomEvt s a) = LH.HashMap TypeRep (LH.HashMap TypeRep [Dynamic])
  EHStorageType t                = [EHType' t]

newtype EventHandler t = EH
  { EventHandler t
-> (Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
   EHStorageType t
unwrapEventHandler :: (Semigroup (EHStorageType t), Monoid (EHStorageType t)) => EHStorageType t
  }

instance Semigroup (EventHandler t) where
  EH a :: (Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
EHStorageType t
a <> :: EventHandler t -> EventHandler t -> EventHandler t
<> EH b :: (Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
EHStorageType t
b = ((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH (((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
  EHStorageType t)
 -> EventHandler t)
-> ((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
    EHStorageType t)
-> EventHandler t
forall a b. (a -> b) -> a -> b
$ EHStorageType t
(Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
EHStorageType t
a EHStorageType t -> EHStorageType t -> EHStorageType t
forall a. Semigroup a => a -> a -> a
<> EHStorageType t
(Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
EHStorageType t
b

instance Monoid (EventHandler t) where
  mempty :: EventHandler t
mempty = ((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH (Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
EHStorageType t
forall a. Monoid a => a
mempty

instance Default EventHandlers where
  def :: EventHandlers
def = TypeRepMap EventHandler -> EventHandlers
EventHandlers (TypeRepMap EventHandler -> EventHandlers)
-> TypeRepMap EventHandler -> EventHandlers
forall a b. (a -> b) -> a -> b
$ [Item (TypeRepMap EventHandler)] -> TypeRepMap EventHandler
forall l. IsList l => [Item l] -> l
fromList [ EventHandler 'ReadyEvt -> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'ReadyEvt -> Item (TypeRepMap EventHandler))
-> EventHandler 'ReadyEvt -> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'ReadyEvt),
  Monoid (EHStorageType 'ReadyEvt)) =>
 EHStorageType 'ReadyEvt)
-> EventHandler 'ReadyEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'ReadyEvt []
                                 , EventHandler 'ChannelCreateEvt -> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'ChannelCreateEvt -> Item (TypeRepMap EventHandler))
-> EventHandler 'ChannelCreateEvt -> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'ChannelCreateEvt),
  Monoid (EHStorageType 'ChannelCreateEvt)) =>
 EHStorageType 'ChannelCreateEvt)
-> EventHandler 'ChannelCreateEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'ChannelCreateEvt []
                                 , EventHandler 'ChannelUpdateEvt -> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'ChannelUpdateEvt -> Item (TypeRepMap EventHandler))
-> EventHandler 'ChannelUpdateEvt -> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'ChannelUpdateEvt),
  Monoid (EHStorageType 'ChannelUpdateEvt)) =>
 EHStorageType 'ChannelUpdateEvt)
-> EventHandler 'ChannelUpdateEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'ChannelUpdateEvt []
                                 , EventHandler 'ChannelDeleteEvt -> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'ChannelDeleteEvt -> Item (TypeRepMap EventHandler))
-> EventHandler 'ChannelDeleteEvt -> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'ChannelDeleteEvt),
  Monoid (EHStorageType 'ChannelDeleteEvt)) =>
 EHStorageType 'ChannelDeleteEvt)
-> EventHandler 'ChannelDeleteEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'ChannelDeleteEvt []
                                 , EventHandler 'ChannelpinsUpdateEvt
-> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'ChannelpinsUpdateEvt
 -> Item (TypeRepMap EventHandler))
-> EventHandler 'ChannelpinsUpdateEvt
-> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'ChannelpinsUpdateEvt),
  Monoid (EHStorageType 'ChannelpinsUpdateEvt)) =>
 EHStorageType 'ChannelpinsUpdateEvt)
-> EventHandler 'ChannelpinsUpdateEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'ChannelpinsUpdateEvt []
                                 , EventHandler 'GuildCreateEvt -> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'GuildCreateEvt -> Item (TypeRepMap EventHandler))
-> EventHandler 'GuildCreateEvt -> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'GuildCreateEvt),
  Monoid (EHStorageType 'GuildCreateEvt)) =>
 EHStorageType 'GuildCreateEvt)
-> EventHandler 'GuildCreateEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'GuildCreateEvt []
                                 , EventHandler 'GuildUpdateEvt -> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'GuildUpdateEvt -> Item (TypeRepMap EventHandler))
-> EventHandler 'GuildUpdateEvt -> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'GuildUpdateEvt),
  Monoid (EHStorageType 'GuildUpdateEvt)) =>
 EHStorageType 'GuildUpdateEvt)
-> EventHandler 'GuildUpdateEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'GuildUpdateEvt []
                                 , EventHandler 'GuildDeleteEvt -> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'GuildDeleteEvt -> Item (TypeRepMap EventHandler))
-> EventHandler 'GuildDeleteEvt -> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'GuildDeleteEvt),
  Monoid (EHStorageType 'GuildDeleteEvt)) =>
 EHStorageType 'GuildDeleteEvt)
-> EventHandler 'GuildDeleteEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'GuildDeleteEvt []
                                 , EventHandler 'GuildBanAddEvt -> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'GuildBanAddEvt -> Item (TypeRepMap EventHandler))
-> EventHandler 'GuildBanAddEvt -> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'GuildBanAddEvt),
  Monoid (EHStorageType 'GuildBanAddEvt)) =>
 EHStorageType 'GuildBanAddEvt)
-> EventHandler 'GuildBanAddEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'GuildBanAddEvt []
                                 , EventHandler 'GuildBanRemoveEvt -> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'GuildBanRemoveEvt -> Item (TypeRepMap EventHandler))
-> EventHandler 'GuildBanRemoveEvt
-> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'GuildBanRemoveEvt),
  Monoid (EHStorageType 'GuildBanRemoveEvt)) =>
 EHStorageType 'GuildBanRemoveEvt)
-> EventHandler 'GuildBanRemoveEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'GuildBanRemoveEvt []
                                 , EventHandler 'GuildEmojisUpdateEvt
-> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'GuildEmojisUpdateEvt
 -> Item (TypeRepMap EventHandler))
-> EventHandler 'GuildEmojisUpdateEvt
-> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'GuildEmojisUpdateEvt),
  Monoid (EHStorageType 'GuildEmojisUpdateEvt)) =>
 EHStorageType 'GuildEmojisUpdateEvt)
-> EventHandler 'GuildEmojisUpdateEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'GuildEmojisUpdateEvt []
                                 , EventHandler 'GuildIntegrationsUpdateEvt
-> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'GuildIntegrationsUpdateEvt
 -> Item (TypeRepMap EventHandler))
-> EventHandler 'GuildIntegrationsUpdateEvt
-> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'GuildIntegrationsUpdateEvt),
  Monoid (EHStorageType 'GuildIntegrationsUpdateEvt)) =>
 EHStorageType 'GuildIntegrationsUpdateEvt)
-> EventHandler 'GuildIntegrationsUpdateEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'GuildIntegrationsUpdateEvt []
                                 , EventHandler 'GuildMemberAddEvt -> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'GuildMemberAddEvt -> Item (TypeRepMap EventHandler))
-> EventHandler 'GuildMemberAddEvt
-> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'GuildMemberAddEvt),
  Monoid (EHStorageType 'GuildMemberAddEvt)) =>
 EHStorageType 'GuildMemberAddEvt)
-> EventHandler 'GuildMemberAddEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'GuildMemberAddEvt []
                                 , EventHandler 'GuildMemberRemoveEvt
-> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'GuildMemberRemoveEvt
 -> Item (TypeRepMap EventHandler))
-> EventHandler 'GuildMemberRemoveEvt
-> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'GuildMemberRemoveEvt),
  Monoid (EHStorageType 'GuildMemberRemoveEvt)) =>
 EHStorageType 'GuildMemberRemoveEvt)
-> EventHandler 'GuildMemberRemoveEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'GuildMemberRemoveEvt []
                                 , EventHandler 'GuildMemberUpdateEvt
-> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'GuildMemberUpdateEvt
 -> Item (TypeRepMap EventHandler))
-> EventHandler 'GuildMemberUpdateEvt
-> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'GuildMemberUpdateEvt),
  Monoid (EHStorageType 'GuildMemberUpdateEvt)) =>
 EHStorageType 'GuildMemberUpdateEvt)
-> EventHandler 'GuildMemberUpdateEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'GuildMemberUpdateEvt []
                                 , EventHandler 'GuildMembersChunkEvt
-> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'GuildMembersChunkEvt
 -> Item (TypeRepMap EventHandler))
-> EventHandler 'GuildMembersChunkEvt
-> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'GuildMembersChunkEvt),
  Monoid (EHStorageType 'GuildMembersChunkEvt)) =>
 EHStorageType 'GuildMembersChunkEvt)
-> EventHandler 'GuildMembersChunkEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'GuildMembersChunkEvt []
                                 , EventHandler 'GuildRoleCreateEvt -> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'GuildRoleCreateEvt
 -> Item (TypeRepMap EventHandler))
-> EventHandler 'GuildRoleCreateEvt
-> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'GuildRoleCreateEvt),
  Monoid (EHStorageType 'GuildRoleCreateEvt)) =>
 EHStorageType 'GuildRoleCreateEvt)
-> EventHandler 'GuildRoleCreateEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'GuildRoleCreateEvt []
                                 , EventHandler 'GuildRoleUpdateEvt -> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'GuildRoleUpdateEvt
 -> Item (TypeRepMap EventHandler))
-> EventHandler 'GuildRoleUpdateEvt
-> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'GuildRoleUpdateEvt),
  Monoid (EHStorageType 'GuildRoleUpdateEvt)) =>
 EHStorageType 'GuildRoleUpdateEvt)
-> EventHandler 'GuildRoleUpdateEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'GuildRoleUpdateEvt []
                                 , EventHandler 'GuildRoleDeleteEvt -> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'GuildRoleDeleteEvt
 -> Item (TypeRepMap EventHandler))
-> EventHandler 'GuildRoleDeleteEvt
-> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'GuildRoleDeleteEvt),
  Monoid (EHStorageType 'GuildRoleDeleteEvt)) =>
 EHStorageType 'GuildRoleDeleteEvt)
-> EventHandler 'GuildRoleDeleteEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'GuildRoleDeleteEvt []
                                 , EventHandler 'MessageCreateEvt -> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'MessageCreateEvt -> Item (TypeRepMap EventHandler))
-> EventHandler 'MessageCreateEvt -> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'MessageCreateEvt),
  Monoid (EHStorageType 'MessageCreateEvt)) =>
 EHStorageType 'MessageCreateEvt)
-> EventHandler 'MessageCreateEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'MessageCreateEvt []
                                 , EventHandler 'MessageUpdateEvt -> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'MessageUpdateEvt -> Item (TypeRepMap EventHandler))
-> EventHandler 'MessageUpdateEvt -> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'MessageUpdateEvt),
  Monoid (EHStorageType 'MessageUpdateEvt)) =>
 EHStorageType 'MessageUpdateEvt)
-> EventHandler 'MessageUpdateEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'MessageUpdateEvt []
                                 , EventHandler 'MessageDeleteEvt -> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'MessageDeleteEvt -> Item (TypeRepMap EventHandler))
-> EventHandler 'MessageDeleteEvt -> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'MessageDeleteEvt),
  Monoid (EHStorageType 'MessageDeleteEvt)) =>
 EHStorageType 'MessageDeleteEvt)
-> EventHandler 'MessageDeleteEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'MessageDeleteEvt []
                                 , EventHandler 'MessageDeleteBulkEvt
-> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'MessageDeleteBulkEvt
 -> Item (TypeRepMap EventHandler))
-> EventHandler 'MessageDeleteBulkEvt
-> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'MessageDeleteBulkEvt),
  Monoid (EHStorageType 'MessageDeleteBulkEvt)) =>
 EHStorageType 'MessageDeleteBulkEvt)
-> EventHandler 'MessageDeleteBulkEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'MessageDeleteBulkEvt []
                                 , EventHandler 'MessageReactionAddEvt
-> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'MessageReactionAddEvt
 -> Item (TypeRepMap EventHandler))
-> EventHandler 'MessageReactionAddEvt
-> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'MessageReactionAddEvt),
  Monoid (EHStorageType 'MessageReactionAddEvt)) =>
 EHStorageType 'MessageReactionAddEvt)
-> EventHandler 'MessageReactionAddEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'MessageReactionAddEvt []
                                 , EventHandler 'MessageReactionRemoveEvt
-> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'MessageReactionRemoveEvt
 -> Item (TypeRepMap EventHandler))
-> EventHandler 'MessageReactionRemoveEvt
-> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'MessageReactionRemoveEvt),
  Monoid (EHStorageType 'MessageReactionRemoveEvt)) =>
 EHStorageType 'MessageReactionRemoveEvt)
-> EventHandler 'MessageReactionRemoveEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'MessageReactionRemoveEvt []
                                 , EventHandler 'MessageReactionRemoveAllEvt
-> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'MessageReactionRemoveAllEvt
 -> Item (TypeRepMap EventHandler))
-> EventHandler 'MessageReactionRemoveAllEvt
-> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'MessageReactionRemoveAllEvt),
  Monoid (EHStorageType 'MessageReactionRemoveAllEvt)) =>
 EHStorageType 'MessageReactionRemoveAllEvt)
-> EventHandler 'MessageReactionRemoveAllEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'MessageReactionRemoveAllEvt []
                                 , EventHandler 'TypingStartEvt -> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'TypingStartEvt -> Item (TypeRepMap EventHandler))
-> EventHandler 'TypingStartEvt -> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'TypingStartEvt),
  Monoid (EHStorageType 'TypingStartEvt)) =>
 EHStorageType 'TypingStartEvt)
-> EventHandler 'TypingStartEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'TypingStartEvt []
                                 , EventHandler 'UserUpdateEvt -> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler 'UserUpdateEvt -> Item (TypeRepMap EventHandler))
-> EventHandler 'UserUpdateEvt -> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType 'UserUpdateEvt),
  Monoid (EHStorageType 'UserUpdateEvt)) =>
 EHStorageType 'UserUpdateEvt)
-> EventHandler 'UserUpdateEvt
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @'UserUpdateEvt []
                                 , EventHandler ('CustomEvt Void Void)
-> Item (TypeRepMap EventHandler)
forall k (a :: k) (f :: k -> *).
Typeable a =>
f a -> WrapTypeable f
WrapTypeable (EventHandler ('CustomEvt Void Void)
 -> Item (TypeRepMap EventHandler))
-> EventHandler ('CustomEvt Void Void)
-> Item (TypeRepMap EventHandler)
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType ('CustomEvt Void Void)),
  Monoid (EHStorageType ('CustomEvt Void Void))) =>
 EHStorageType ('CustomEvt Void Void))
-> EventHandler ('CustomEvt Void Void)
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @('CustomEvt Void Void) (Semigroup (EHStorageType ('CustomEvt Void Void)),
 Monoid (EHStorageType ('CustomEvt Void Void))) =>
EHStorageType ('CustomEvt Void Void)
forall k v. HashMap k v
LH.empty
                                 ]

instance Semigroup EventHandlers where
  (EventHandlers a :: TypeRepMap EventHandler
a) <> :: EventHandlers -> EventHandlers -> EventHandlers
<> (EventHandlers b :: TypeRepMap EventHandler
b) = TypeRepMap EventHandler -> EventHandlers
EventHandlers (TypeRepMap EventHandler -> EventHandlers)
-> TypeRepMap EventHandler -> EventHandlers
forall a b. (a -> b) -> a -> b
$ (forall (x :: EventType).
 Typeable x =>
 EventHandler x -> EventHandler x -> EventHandler x)
-> TypeRepMap EventHandler
-> TypeRepMap EventHandler
-> TypeRepMap EventHandler
forall k (f :: k -> *).
(forall (x :: k). Typeable x => f x -> f x -> f x)
-> TypeRepMap f -> TypeRepMap f -> TypeRepMap f
TM.unionWith forall a. Semigroup a => a -> a -> a
forall (x :: EventType).
Typeable x =>
EventHandler x -> EventHandler x -> EventHandler x
(<>) TypeRepMap EventHandler
a TypeRepMap EventHandler
b

instance Monoid EventHandlers where
  mempty :: EventHandlers
mempty = EventHandlers
forall a. Default a => a
def

-- not sure what to think of this

type family EHInstanceSelector (d :: EventType) :: Bool where
  EHInstanceSelector ('CustomEvt _ _) = 'True
  EHInstanceSelector _                = 'False

class InsertEventHandler a m where
  makeEventHandlers :: Proxy a -> Proxy m -> EHType a m -> EventHandlers

instance (EHInstanceSelector a ~ flag, InsertEventHandler' flag a m) => InsertEventHandler a m where
  makeEventHandlers :: Proxy a -> Proxy m -> EHType a m -> EventHandlers
makeEventHandlers = Proxy flag -> Proxy a -> Proxy m -> EHType a m -> EventHandlers
forall (flag :: Bool) (a :: EventType) (m :: * -> *).
InsertEventHandler' flag a m =>
Proxy flag -> Proxy a -> Proxy m -> EHType a m -> EventHandlers
makeEventHandlers' (Proxy flag
forall k (t :: k). Proxy t
Proxy @flag)

class InsertEventHandler' (flag :: Bool) a m where
  makeEventHandlers' :: Proxy flag -> Proxy a -> Proxy m -> EHType a m -> EventHandlers

instance (Typeable a, Typeable s, Typeable (EHType ('CustomEvt s a) m))
  => InsertEventHandler' 'True ('CustomEvt s a) m where
  makeEventHandlers' :: Proxy 'True
-> Proxy ('CustomEvt s a)
-> Proxy m
-> EHType ('CustomEvt s a) m
-> EventHandlers
makeEventHandlers' _ _ _ handler :: EHType ('CustomEvt s a) m
handler = TypeRepMap EventHandler -> EventHandlers
EventHandlers (TypeRepMap EventHandler -> EventHandlers)
-> (EventHandler ('CustomEvt Void Void) -> TypeRepMap EventHandler)
-> EventHandler ('CustomEvt Void Void)
-> EventHandlers
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EventHandler ('CustomEvt Void Void) -> TypeRepMap EventHandler
forall k (a :: k) (f :: k -> *). Typeable a => f a -> TypeRepMap f
TM.one (EventHandler ('CustomEvt Void Void) -> EventHandlers)
-> EventHandler ('CustomEvt Void Void) -> EventHandlers
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType ('CustomEvt Void Void)),
  Monoid (EHStorageType ('CustomEvt Void Void))) =>
 EHStorageType ('CustomEvt Void Void))
-> EventHandler ('CustomEvt Void Void)
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @('CustomEvt Void Void)
    (TypeRep
-> HashMap TypeRep [Dynamic]
-> HashMap TypeRep (HashMap TypeRep [Dynamic])
forall k v. Hashable k => k -> v -> HashMap k v
LH.singleton (Proxy s -> TypeRep
forall k (proxy :: k -> *) (a :: k).
Typeable a =>
proxy a -> TypeRep
typeRep (Proxy s -> TypeRep) -> Proxy s -> TypeRep
forall a b. (a -> b) -> a -> b
$ Proxy s
forall k (t :: k). Proxy t
Proxy @s) (TypeRep -> [Dynamic] -> HashMap TypeRep [Dynamic]
forall k v. Hashable k => k -> v -> HashMap k v
LH.singleton (Proxy a -> TypeRep
forall k (proxy :: k -> *) (a :: k).
Typeable a =>
proxy a -> TypeRep
typeRep (Proxy a -> TypeRep) -> Proxy a -> TypeRep
forall a b. (a -> b) -> a -> b
$ Proxy a
forall k (t :: k). Proxy t
Proxy @a) [EHType ('CustomEvt s a) m -> Dynamic
forall a. Typeable a => a -> Dynamic
toDyn EHType ('CustomEvt s a) m
handler]))

instance (Typeable s, EHStorageType s ~ [Dynamic], Typeable (EHType s m)) => InsertEventHandler' 'False s m where
  makeEventHandlers' :: Proxy 'False -> Proxy s -> Proxy m -> EHType s m -> EventHandlers
makeEventHandlers' _ _ _ handler :: EHType s m
handler = TypeRepMap EventHandler -> EventHandlers
EventHandlers (TypeRepMap EventHandler -> EventHandlers)
-> (EventHandler s -> TypeRepMap EventHandler)
-> EventHandler s
-> EventHandlers
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EventHandler s -> TypeRepMap EventHandler
forall k (a :: k) (f :: k -> *). Typeable a => f a -> TypeRepMap f
TM.one (EventHandler s -> EventHandlers)
-> EventHandler s -> EventHandlers
forall a b. (a -> b) -> a -> b
$ ((Semigroup (EHStorageType s), Monoid (EHStorageType s)) =>
 EHStorageType s)
-> EventHandler s
forall (t :: EventType).
((Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
 EHStorageType t)
-> EventHandler t
EH @s [EHType s m -> Dynamic
forall a. Typeable a => a -> Dynamic
toDyn EHType s m
handler]


class GetEventHandlers a m where
  getEventHandlers :: EventHandlers -> [EHType a m]

instance (EHInstanceSelector a ~ flag, GetEventHandlers' flag a m) => GetEventHandlers a m where
  getEventHandlers :: EventHandlers -> [EHType a m]
getEventHandlers = Proxy a -> Proxy m -> Proxy flag -> EventHandlers -> [EHType a m]
forall (flag :: Bool) (a :: EventType) (m :: * -> *).
GetEventHandlers' flag a m =>
Proxy a -> Proxy m -> Proxy flag -> EventHandlers -> [EHType a m]
getEventHandlers' (Proxy a
forall k (t :: k). Proxy t
Proxy @a) (Proxy m
forall k (t :: k). Proxy t
Proxy @m) (Proxy flag
forall k (t :: k). Proxy t
Proxy @flag)

class GetEventHandlers' (flag :: Bool) a m where
  getEventHandlers' :: Proxy a -> Proxy m -> Proxy flag -> EventHandlers -> [EHType a m]

instance (Typeable a, Typeable s, Typeable (EHType ('CustomEvt s a) m)) => GetEventHandlers' 'True ('CustomEvt s a) m where
  getEventHandlers' :: Proxy ('CustomEvt s a)
-> Proxy m
-> Proxy 'True
-> EventHandlers
-> [EHType ('CustomEvt s a) m]
getEventHandlers' _ _ _ (EventHandlers handlers :: TypeRepMap EventHandler
handlers) =
    let handlerMap :: EHStorageType ('CustomEvt Void Void)
handlerMap = EventHandler ('CustomEvt Void Void)
-> (Semigroup (EHStorageType ('CustomEvt Void Void)),
    Monoid (EHStorageType ('CustomEvt Void Void))) =>
   EHStorageType ('CustomEvt Void Void)
forall (t :: EventType).
EventHandler t
-> (Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
   EHStorageType t
unwrapEventHandler @('CustomEvt Void Void) (EventHandler ('CustomEvt Void Void)
 -> EHStorageType ('CustomEvt Void Void))
-> EventHandler ('CustomEvt Void Void)
-> EHStorageType ('CustomEvt Void Void)
forall a b. (a -> b) -> a -> b
$ Maybe (EventHandler ('CustomEvt Void Void))
-> EventHandler ('CustomEvt Void Void)
forall a. HasCallStack => Maybe a -> a
fromJust
          (TypeRepMap EventHandler
-> Maybe (EventHandler ('CustomEvt Void Void))
forall k (a :: k) (f :: k -> *).
Typeable a =>
TypeRepMap f -> Maybe (f a)
TM.lookup TypeRepMap EventHandler
handlers :: Maybe (EventHandler ('CustomEvt Void Void)))
    in Maybe [EHType ('CustomEvt s a) m] -> [EHType ('CustomEvt s a) m]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (Maybe [EHType ('CustomEvt s a) m] -> [EHType ('CustomEvt s a) m])
-> Maybe [EHType ('CustomEvt s a) m] -> [EHType ('CustomEvt s a) m]
forall a b. (a -> b) -> a -> b
$ TypeRep
-> HashMap TypeRep (HashMap TypeRep [Dynamic])
-> Maybe (HashMap TypeRep [Dynamic])
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
LH.lookup (Proxy s -> TypeRep
forall k (proxy :: k -> *) (a :: k).
Typeable a =>
proxy a -> TypeRep
typeRep (Proxy s -> TypeRep) -> Proxy s -> TypeRep
forall a b. (a -> b) -> a -> b
$ Proxy s
forall k (t :: k). Proxy t
Proxy @s) HashMap TypeRep (HashMap TypeRep [Dynamic])
EHStorageType ('CustomEvt Void Void)
handlerMap Maybe (HashMap TypeRep [Dynamic])
-> (HashMap TypeRep [Dynamic] -> Maybe [Dynamic])
-> Maybe [Dynamic]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= TypeRep -> HashMap TypeRep [Dynamic] -> Maybe [Dynamic]
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
LH.lookup (Proxy a -> TypeRep
forall k (proxy :: k -> *) (a :: k).
Typeable a =>
proxy a -> TypeRep
typeRep (Proxy a -> TypeRep) -> Proxy a -> TypeRep
forall a b. (a -> b) -> a -> b
$ Proxy a
forall k (t :: k). Proxy t
Proxy @a) Maybe [Dynamic]
-> ([Dynamic] -> [EHType ('CustomEvt s a) m])
-> Maybe [EHType ('CustomEvt s a) m]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> (Dynamic -> EHType ('CustomEvt s a) m)
-> [Dynamic] -> [EHType ('CustomEvt s a) m]
forall a b. (a -> b) -> [a] -> [b]
map
       (Maybe (EHType ('CustomEvt s a) m) -> EHType ('CustomEvt s a) m
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe (EHType ('CustomEvt s a) m) -> EHType ('CustomEvt s a) m)
-> (Dynamic -> Maybe (EHType ('CustomEvt s a) m))
-> Dynamic
-> EHType ('CustomEvt s a) m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Dynamic -> Maybe (EHType ('CustomEvt s a) m)
forall a. Typeable a => Dynamic -> Maybe a
fromDynamic)

instance (Typeable s, Typeable (EHType s m), EHStorageType s ~ [Dynamic]) => GetEventHandlers' 'False s m where
  getEventHandlers' :: Proxy s -> Proxy m -> Proxy 'False -> EventHandlers -> [EHType s m]
getEventHandlers' _ _ _ (EventHandlers handlers :: TypeRepMap EventHandler
handlers) =
    let theseHandlers :: EHStorageType s
theseHandlers = EventHandler s
-> (Semigroup (EHStorageType s), Monoid (EHStorageType s)) =>
   EHStorageType s
forall (t :: EventType).
EventHandler t
-> (Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
   EHStorageType t
unwrapEventHandler @s (EventHandler s -> EHStorageType s)
-> EventHandler s -> EHStorageType s
forall a b. (a -> b) -> a -> b
$ Maybe (EventHandler s) -> EventHandler s
forall a. HasCallStack => Maybe a -> a
fromJust (TypeRepMap EventHandler -> Maybe (EventHandler s)
forall k (a :: k) (f :: k -> *).
Typeable a =>
TypeRepMap f -> Maybe (f a)
TM.lookup TypeRepMap EventHandler
handlers :: Maybe (EventHandler s))
    in (Dynamic -> EHType s m) -> [Dynamic] -> [EHType s m]
forall a b. (a -> b) -> [a] -> [b]
map (Maybe (EHType s m) -> EHType s m
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe (EHType s m) -> EHType s m)
-> (Dynamic -> Maybe (EHType s m)) -> Dynamic -> EHType s m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Dynamic -> Maybe (EHType s m)
forall a. Typeable a => Dynamic -> Maybe a
fromDynamic) [Dynamic]
EHStorageType s
theseHandlers


getCustomEventHandlers :: TypeRep -> TypeRep -> EventHandlers -> [Dynamic]
getCustomEventHandlers :: TypeRep -> TypeRep -> EventHandlers -> [Dynamic]
getCustomEventHandlers s :: TypeRep
s a :: TypeRep
a (EventHandlers handlers :: TypeRepMap EventHandler
handlers) =
    let handlerMap :: EHStorageType ('CustomEvt Void Void)
handlerMap = EventHandler ('CustomEvt Void Void)
-> (Semigroup (EHStorageType ('CustomEvt Void Void)),
    Monoid (EHStorageType ('CustomEvt Void Void))) =>
   EHStorageType ('CustomEvt Void Void)
forall (t :: EventType).
EventHandler t
-> (Semigroup (EHStorageType t), Monoid (EHStorageType t)) =>
   EHStorageType t
unwrapEventHandler @('CustomEvt Void Void) (EventHandler ('CustomEvt Void Void)
 -> EHStorageType ('CustomEvt Void Void))
-> EventHandler ('CustomEvt Void Void)
-> EHStorageType ('CustomEvt Void Void)
forall a b. (a -> b) -> a -> b
$ Maybe (EventHandler ('CustomEvt Void Void))
-> EventHandler ('CustomEvt Void Void)
forall a. HasCallStack => Maybe a -> a
fromJust
          (TypeRepMap EventHandler
-> Maybe (EventHandler ('CustomEvt Void Void))
forall k (a :: k) (f :: k -> *).
Typeable a =>
TypeRepMap f -> Maybe (f a)
TM.lookup TypeRepMap EventHandler
handlers :: Maybe (EventHandler ('CustomEvt Void Void)))
    in Maybe [Dynamic] -> [Dynamic]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (Maybe [Dynamic] -> [Dynamic]) -> Maybe [Dynamic] -> [Dynamic]
forall a b. (a -> b) -> a -> b
$ TypeRep
-> HashMap TypeRep (HashMap TypeRep [Dynamic])
-> Maybe (HashMap TypeRep [Dynamic])
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
LH.lookup TypeRep
s HashMap TypeRep (HashMap TypeRep [Dynamic])
EHStorageType ('CustomEvt Void Void)
handlerMap Maybe (HashMap TypeRep [Dynamic])
-> (HashMap TypeRep [Dynamic] -> Maybe [Dynamic])
-> Maybe [Dynamic]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= TypeRep -> HashMap TypeRep [Dynamic] -> Maybe [Dynamic]
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
LH.lookup TypeRep
a