packages feed

calamity 0.1.12.0 → 0.1.13.0

raw patch · 5 files changed

+90/−236 lines, 5 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Calamity.Client.Types: instance forall s1 a (s2 :: s1). (Data.Typeable.Internal.Typeable a, Data.Typeable.Internal.Typeable s2, Data.Typeable.Internal.Typeable (Calamity.Client.Types.StoredEHType ('Calamity.Client.Types.CustomEvt s2 a)), Calamity.Client.Types.EHType ('Calamity.Client.Types.CustomEvt s2 a) GHC.Types.IO () GHC.Types.~ (a -> GHC.Types.IO ())) => Calamity.Client.Types.InsertEventHandler' 'GHC.Types.True ('Calamity.Client.Types.CustomEvt s2 a)
- Calamity.Client.Types: type WaitUntilConstraints r s eh check t = (InsertEventHandler s, RemoveEventHandler s, Uncurry eh, eh ~ EHType s (Sem r) (), eh ~ Curried (t -> Sem r ()), Uncurry check, Uncurried check ~ (t -> Bool), Curry (t -> IO ()), Curried (t -> IO ()) ~ EHType s IO ())
- Calamity.Client.Types: type WaitUntilMConstraints r s eh ehB t = (InsertEventHandler s, RemoveEventHandler s, Uncurry eh, eh ~ EHType s (Sem r) (), eh ~ Curried (t -> Sem r ()), Uncurry ehB, Uncurried ehB ~ (t -> Sem r Bool), Curry (t -> IO ()), Curried (t -> IO ()) ~ EHType s IO ())
- Calamity.Internal.GenericCurry: class Curry t where {
- Calamity.Internal.GenericCurry: class Uncurry t where {
- Calamity.Internal.GenericCurry: curryG :: Curry t => t -> Curried t
- Calamity.Internal.GenericCurry: instance (Calamity.Internal.GenericCurry.CurryInstanceSelector t GHC.Types.~ flag, Calamity.Internal.GenericCurry.Curry' flag t) => Calamity.Internal.GenericCurry.Curry t
- Calamity.Internal.GenericCurry: instance (Calamity.Internal.GenericCurry.CurryInstanceSelector t GHC.Types.~ flag, Calamity.Internal.GenericCurry.Uncurry' flag t) => Calamity.Internal.GenericCurry.Uncurry t
- Calamity.Internal.GenericCurry: instance Calamity.Internal.GenericCurry.Curry' 1 (a -> r)
- Calamity.Internal.GenericCurry: instance Calamity.Internal.GenericCurry.Curry' 2 ((a, b) -> r)
- Calamity.Internal.GenericCurry: instance Calamity.Internal.GenericCurry.Curry' 3 ((a, b, c) -> r)
- Calamity.Internal.GenericCurry: instance Calamity.Internal.GenericCurry.Curry' 4 ((a, b, c, d) -> r)
- Calamity.Internal.GenericCurry: instance Calamity.Internal.GenericCurry.Curry' 5 ((a, b, c, d, e) -> r)
- Calamity.Internal.GenericCurry: instance Calamity.Internal.GenericCurry.Curry' 6 ((a, b, c, d, e, f) -> r)
- Calamity.Internal.GenericCurry: instance Calamity.Internal.GenericCurry.Uncurry' 1 (a -> r)
- Calamity.Internal.GenericCurry: instance Calamity.Internal.GenericCurry.Uncurry' 2 (a -> b -> r)
- Calamity.Internal.GenericCurry: instance Calamity.Internal.GenericCurry.Uncurry' 3 (a -> b -> c -> r)
- Calamity.Internal.GenericCurry: instance Calamity.Internal.GenericCurry.Uncurry' 4 (a -> b -> c -> d -> r)
- Calamity.Internal.GenericCurry: instance Calamity.Internal.GenericCurry.Uncurry' 5 (a -> b -> c -> d -> e -> r)
- Calamity.Internal.GenericCurry: instance Calamity.Internal.GenericCurry.Uncurry' 6 (a -> b -> c -> d -> e -> f -> r)
- Calamity.Internal.GenericCurry: type family Uncurried t;
- Calamity.Internal.GenericCurry: uncurryG :: Uncurry t => t -> Uncurried t
- Calamity.Internal.GenericCurry: }
+ Calamity.Client.Types: instance forall s1 a (s2 :: s1). (Data.Typeable.Internal.Typeable a, Data.Typeable.Internal.Typeable s2, Data.Typeable.Internal.Typeable (Calamity.Client.Types.StoredEHType ('Calamity.Client.Types.CustomEvt s2 a)), (Calamity.Client.Types.EHType ('Calamity.Client.Types.CustomEvt s2 a) -> GHC.Types.IO ()) GHC.Types.~ (a -> GHC.Types.IO ())) => Calamity.Client.Types.InsertEventHandler' 'GHC.Types.True ('Calamity.Client.Types.CustomEvt s2 a)
- Calamity.Cache.Eff: delDM :: forall r_a9O6s. MemberWithError CacheEff r_a9O6s => Snowflake DMChannel -> Sem r_a9O6s ()
+ Calamity.Cache.Eff: delDM :: forall r_a9NFF. MemberWithError CacheEff r_a9NFF => Snowflake DMChannel -> Sem r_a9NFF ()
- Calamity.Cache.Eff: delGuild :: forall r_a9O6l. MemberWithError CacheEff r_a9O6l => Snowflake Guild -> Sem r_a9O6l ()
+ Calamity.Cache.Eff: delGuild :: forall r_a9NFy. MemberWithError CacheEff r_a9NFy => Snowflake Guild -> Sem r_a9NFy ()
- Calamity.Cache.Eff: delMessage :: forall r_a9O6N. MemberWithError CacheEff r_a9O6N => Snowflake Message -> Sem r_a9O6N ()
+ Calamity.Cache.Eff: delMessage :: forall r_a9NG0. MemberWithError CacheEff r_a9NG0 => Snowflake Message -> Sem r_a9NG0 ()
- Calamity.Cache.Eff: delUnavailableGuild :: forall r_a9O6G. MemberWithError CacheEff r_a9O6G => Snowflake Guild -> Sem r_a9O6G ()
+ Calamity.Cache.Eff: delUnavailableGuild :: forall r_a9NFT. MemberWithError CacheEff r_a9NFT => Snowflake Guild -> Sem r_a9NFT ()
- Calamity.Cache.Eff: delUser :: forall r_a9O6z. MemberWithError CacheEff r_a9O6z => Snowflake User -> Sem r_a9O6z ()
+ Calamity.Cache.Eff: delUser :: forall r_a9NFM. MemberWithError CacheEff r_a9NFM => Snowflake User -> Sem r_a9NFM ()
- Calamity.Cache.Eff: getBotUser :: forall r_a9O6d. MemberWithError CacheEff r_a9O6d => Sem r_a9O6d (Maybe User)
+ Calamity.Cache.Eff: getBotUser :: forall r_a9NFq. MemberWithError CacheEff r_a9NFq => Sem r_a9NFq (Maybe User)
- Calamity.Cache.Eff: getDM :: forall r_a9O6p. MemberWithError CacheEff r_a9O6p => Snowflake DMChannel -> Sem r_a9O6p (Maybe DMChannel)
+ Calamity.Cache.Eff: getDM :: forall r_a9NFC. MemberWithError CacheEff r_a9NFC => Snowflake DMChannel -> Sem r_a9NFC (Maybe DMChannel)
- Calamity.Cache.Eff: getDMs :: forall r_a9O6r. MemberWithError CacheEff r_a9O6r => Sem r_a9O6r [DMChannel]
+ Calamity.Cache.Eff: getDMs :: forall r_a9NFE. MemberWithError CacheEff r_a9NFE => Sem r_a9NFE [DMChannel]
- Calamity.Cache.Eff: getGuild :: forall r_a9O6g. MemberWithError CacheEff r_a9O6g => Snowflake Guild -> Sem r_a9O6g (Maybe Guild)
+ Calamity.Cache.Eff: getGuild :: forall r_a9NFt. MemberWithError CacheEff r_a9NFt => Snowflake Guild -> Sem r_a9NFt (Maybe Guild)
- Calamity.Cache.Eff: getGuildChannel :: forall r_a9O6i. MemberWithError CacheEff r_a9O6i => Snowflake GuildChannel -> Sem r_a9O6i (Maybe GuildChannel)
+ Calamity.Cache.Eff: getGuildChannel :: forall r_a9NFv. MemberWithError CacheEff r_a9NFv => Snowflake GuildChannel -> Sem r_a9NFv (Maybe GuildChannel)
- Calamity.Cache.Eff: getGuilds :: forall r_a9O6k. MemberWithError CacheEff r_a9O6k => Sem r_a9O6k [Guild]
+ Calamity.Cache.Eff: getGuilds :: forall r_a9NFx. MemberWithError CacheEff r_a9NFx => Sem r_a9NFx [Guild]
- Calamity.Cache.Eff: getMessage :: forall r_a9O6K. MemberWithError CacheEff r_a9O6K => Snowflake Message -> Sem r_a9O6K (Maybe Message)
+ Calamity.Cache.Eff: getMessage :: forall r_a9NFX. MemberWithError CacheEff r_a9NFX => Snowflake Message -> Sem r_a9NFX (Maybe Message)
- Calamity.Cache.Eff: getMessages :: forall r_a9O6M. MemberWithError CacheEff r_a9O6M => Sem r_a9O6M [Message]
+ Calamity.Cache.Eff: getMessages :: forall r_a9NFZ. MemberWithError CacheEff r_a9NFZ => Sem r_a9NFZ [Message]
- Calamity.Cache.Eff: getUnavailableGuilds :: forall r_a9O6F. MemberWithError CacheEff r_a9O6F => Sem r_a9O6F [Snowflake Guild]
+ Calamity.Cache.Eff: getUnavailableGuilds :: forall r_a9NFS. MemberWithError CacheEff r_a9NFS => Sem r_a9NFS [Snowflake Guild]
- Calamity.Cache.Eff: getUser :: forall r_a9O6w. MemberWithError CacheEff r_a9O6w => Snowflake User -> Sem r_a9O6w (Maybe User)
+ Calamity.Cache.Eff: getUser :: forall r_a9NFJ. MemberWithError CacheEff r_a9NFJ => Snowflake User -> Sem r_a9NFJ (Maybe User)
- Calamity.Cache.Eff: getUsers :: forall r_a9O6y. MemberWithError CacheEff r_a9O6y => Sem r_a9O6y [User]
+ Calamity.Cache.Eff: getUsers :: forall r_a9NFL. MemberWithError CacheEff r_a9NFL => Sem r_a9NFL [User]
- Calamity.Cache.Eff: isUnavailableGuild :: forall r_a9O6D. MemberWithError CacheEff r_a9O6D => Snowflake Guild -> Sem r_a9O6D Bool
+ Calamity.Cache.Eff: isUnavailableGuild :: forall r_a9NFQ. MemberWithError CacheEff r_a9NFQ => Snowflake Guild -> Sem r_a9NFQ Bool
- Calamity.Cache.Eff: setBotUser :: forall r_a9O6b. MemberWithError CacheEff r_a9O6b => User -> Sem r_a9O6b ()
+ Calamity.Cache.Eff: setBotUser :: forall r_a9NFo. MemberWithError CacheEff r_a9NFo => User -> Sem r_a9NFo ()
- Calamity.Cache.Eff: setDM :: forall r_a9O6n. MemberWithError CacheEff r_a9O6n => DMChannel -> Sem r_a9O6n ()
+ Calamity.Cache.Eff: setDM :: forall r_a9NFA. MemberWithError CacheEff r_a9NFA => DMChannel -> Sem r_a9NFA ()
- Calamity.Cache.Eff: setGuild :: forall r_a9O6e. MemberWithError CacheEff r_a9O6e => Guild -> Sem r_a9O6e ()
+ Calamity.Cache.Eff: setGuild :: forall r_a9NFr. MemberWithError CacheEff r_a9NFr => Guild -> Sem r_a9NFr ()
- Calamity.Cache.Eff: setMessage :: forall r_a9O6I. MemberWithError CacheEff r_a9O6I => Message -> Sem r_a9O6I ()
+ Calamity.Cache.Eff: setMessage :: forall r_a9NFV. MemberWithError CacheEff r_a9NFV => Message -> Sem r_a9NFV ()
- Calamity.Cache.Eff: setUnavailableGuild :: forall r_a9O6B. MemberWithError CacheEff r_a9O6B => Snowflake Guild -> Sem r_a9O6B ()
+ Calamity.Cache.Eff: setUnavailableGuild :: forall r_a9NFO. MemberWithError CacheEff r_a9NFO => Snowflake Guild -> Sem r_a9NFO ()
- Calamity.Cache.Eff: setUser :: forall r_a9O6u. MemberWithError CacheEff r_a9O6u => User -> Sem r_a9O6u ()
+ Calamity.Cache.Eff: setUser :: forall r_a9NFH. MemberWithError CacheEff r_a9NFH => User -> Sem r_a9NFH ()
- Calamity.Client.Client: react :: forall (s :: EventType) r t eh ehIO. (BotC r, ReactConstraints r s eh ehIO t) => EHType s (Sem r) () -> Sem r (Sem r ())
+ Calamity.Client.Client: react :: forall (s :: EventType) r. (BotC r, ReactConstraints s) => (EHType s -> Sem r ()) -> Sem r (Sem r ())
- Calamity.Client.Client: waitUntil :: forall (s :: EventType) r t eh check. (BotC r, WaitUntilConstraints r s eh check t) => check -> Sem r t
+ Calamity.Client.Client: waitUntil :: forall (s :: EventType) r. (BotC r, ReactConstraints s) => (EHType s -> Bool) -> Sem r (EHType s)
- Calamity.Client.Client: waitUntilM :: forall (s :: EventType) r t eh ehB. (BotC r, WaitUntilMConstraints r s eh ehB t) => ehB -> Sem r t
+ Calamity.Client.Client: waitUntilM :: forall (s :: EventType) r. (BotC r, ReactConstraints s) => (EHType s -> Sem r Bool) -> Sem r (EHType s)
- Calamity.Client.Types: type ReactConstraints r s eh ehIO t = (InsertEventHandler s, RemoveEventHandler s, eh ~ EHType s (Sem r) (), ehIO ~ EHType s IO (), Uncurry eh, Uncurried eh ~ (t -> Sem r ()), Curry (t -> IO ()), ehIO ~ Curried (t -> IO ()))
+ Calamity.Client.Types: type ReactConstraints s = (InsertEventHandler s, RemoveEventHandler s)
- Calamity.Client.Types: type family EHType (d :: EventType) m r
+ Calamity.Client.Types: type family EHType (d :: EventType)
- Calamity.Commands.ParsePrefix: parsePrefix :: forall r_a7rjS. MemberWithError ParsePrefix r_a7rjS => Message -> Sem r_a7rjS (Maybe (Text, Text))
+ Calamity.Commands.ParsePrefix: parsePrefix :: forall r_a7qT5. MemberWithError ParsePrefix r_a7qT5 => Message -> Sem r_a7qT5 (Maybe (Text, Text))
- Calamity.Internal.LocalWriter: llisten :: forall o_aF4l r_aF5Z a_XF4l. MemberWithError (LocalWriter o_aF4l) r_aF5Z => Sem r_aF5Z a_XF4l -> Sem r_aF5Z (o_aF4l, a_XF4l)
+ Calamity.Internal.LocalWriter: llisten :: forall o_aEpc r_aEFc a_XEpc. MemberWithError (LocalWriter o_aEpc) r_aEFc => Sem r_aEFc a_XEpc -> Sem r_aEFc (o_aEpc, a_XEpc)
- Calamity.Internal.LocalWriter: ltell :: forall o_aF4h r_aF5X. MemberWithError (LocalWriter o_aF4h) r_aF5X => o_aF4h -> Sem r_aF5X ()
+ Calamity.Internal.LocalWriter: ltell :: forall o_aEp8 r_aEFa. MemberWithError (LocalWriter o_aEp8) r_aEFa => o_aEp8 -> Sem r_aEFa ()
- Calamity.Internal.RunIntoIO: intoIO :: forall p_aG97 r_aG99 r_aGee. MemberWithError (IntoIO p_aG97 r_aG99) r_aGee => (p_aG97 -> Sem r_aGee r_aG99) -> Sem r_aGee (p_aG97 -> IO (Maybe r_aG99))
+ Calamity.Internal.RunIntoIO: intoIO :: forall p_aFIk r_aFIm r_aFNr. MemberWithError (IntoIO p_aFIk r_aFIm) r_aFNr => (p_aFIk -> Sem r_aFNr r_aFIm) -> Sem r_aFNr (p_aFIk -> IO (Maybe r_aFIm))
- Calamity.Metrics.Eff: addCounter :: forall r_aIVp. MemberWithError MetricEff r_aIVp => Int -> Counter -> Sem r_aIVp Int
+ Calamity.Metrics.Eff: addCounter :: forall r_aIuC. MemberWithError MetricEff r_aIuC => Int -> Counter -> Sem r_aIuC Int
- Calamity.Metrics.Eff: modifyGauge :: forall r_aIVs. MemberWithError MetricEff r_aIVs => (Double -> Double) -> Gauge -> Sem r_aIVs Double
+ Calamity.Metrics.Eff: modifyGauge :: forall r_aIuF. MemberWithError MetricEff r_aIuF => (Double -> Double) -> Gauge -> Sem r_aIuF Double
- Calamity.Metrics.Eff: observeHistogram :: forall r_aIVv. MemberWithError MetricEff r_aIVv => Double -> Histogram -> Sem r_aIVv HistogramSample
+ Calamity.Metrics.Eff: observeHistogram :: forall r_aIuI. MemberWithError MetricEff r_aIuI => Double -> Histogram -> Sem r_aIuI HistogramSample
- Calamity.Metrics.Eff: registerCounter :: forall r_aIVf. MemberWithError MetricEff r_aIVf => Text -> [(Text, Text)] -> Sem r_aIVf Counter
+ Calamity.Metrics.Eff: registerCounter :: forall r_aIus. MemberWithError MetricEff r_aIus => Text -> [(Text, Text)] -> Sem r_aIus Counter
- Calamity.Metrics.Eff: registerGauge :: forall r_aIVi. MemberWithError MetricEff r_aIVi => Text -> [(Text, Text)] -> Sem r_aIVi Gauge
+ Calamity.Metrics.Eff: registerGauge :: forall r_aIuv. MemberWithError MetricEff r_aIuv => Text -> [(Text, Text)] -> Sem r_aIuv Gauge
- Calamity.Metrics.Eff: registerHistogram :: forall r_aIVl. MemberWithError MetricEff r_aIVl => Text -> [(Text, Text)] -> [Double] -> Sem r_aIVl Histogram
+ Calamity.Metrics.Eff: registerHistogram :: forall r_aIuy. MemberWithError MetricEff r_aIuy => Text -> [(Text, Text)] -> [Double] -> Sem r_aIuy Histogram

Files

ChangeLog.md view
@@ -1,5 +1,12 @@ # Changelog for Calamity +## 0.1.13.0++*2020-06-06*++* Changed event handlers to take tuples instead of being higher arity when there+  is more than one parameter to the callback.+ ## 0.1.12.0  *2020-06-06*
calamity.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: dc8569a5fcc9d4c838ce504e002cc38a1016ff3089378cbf8437b12f4f6c4e60+-- hash: 81cfbc5822a563275b09910155612968095794467d65ba95f1eaa54d90312085  name:           calamity-version:        0.1.12.0+version:        0.1.13.0 synopsis:       A library for writing discord bots description:    Please see the README on GitHub at <https://github.com/nitros12/calamity#readme> category:       Network, Web@@ -75,7 +75,6 @@       Calamity.Internal.AesonThings       Calamity.Internal.BoundedStore       Calamity.Internal.ConstructorName-      Calamity.Internal.GenericCurry       Calamity.Internal.IntColour       Calamity.Internal.LocalWriter       Calamity.Internal.RunIntoIO
src/Calamity/Client/Client.hs view
@@ -22,7 +22,6 @@ import           Calamity.Gateway.Intents import           Calamity.HTTP.Internal.Ratelimit import           Calamity.Internal.ConstructorName-import           Calamity.Internal.GenericCurry import           Calamity.Internal.RunIntoIO import qualified Calamity.Internal.SnowflakeMap    as SM import           Calamity.Internal.Updateable@@ -149,15 +148,15 @@ -- This function is pretty bad for giving nasty type errors, -- since if something doesn't match then 'EHType' might not get substituted, -- which will result in errors about parameter counts mismatching.-react :: forall (s :: EventType) r t eh ehIO.-      (BotC r, ReactConstraints r s eh ehIO t)-      => EHType s (P.Sem r) ()+react :: forall (s :: EventType) r.+      (BotC r, ReactConstraints s)+      => (EHType s -> (P.Sem r) ())       -> P.Sem r (P.Sem r ()) react handler = do-  handler' <- bindSemToIO $ uncurryG handler+  handler' <- bindSemToIO handler   ehidC <- P.asks (^. #ehidCounter)   id' <- P.embed $ atomicModifyIORef ehidC (\i -> (succ i, i))-  let handlers = makeEventHandlers (Proxy @s) id' (const () <.> curryG handler')+  let handlers = makeEventHandlers (Proxy @s) id' (const () <.> handler')   P.atomicModify (handlers <>)   pure $ removeHandler @s id' @@ -215,7 +214,7 @@ -- And for @s ~ \''MessageUpdateEvt'@: -- -- @--- 'waitUntil' :: ('Message' -> 'Message' -> 'Bool') -> 'P.Sem' r ('Message', 'Message')+-- 'waitUntil' :: (('Message', 'Message') -> 'Bool') -> 'P.Sem' r ('Message', 'Message') -- @ -- -- ==== Examples@@ -227,20 +226,20 @@ --        print $ msg ^. #content -- @ waitUntil-  :: forall (s :: EventType) r t eh check.-  ( BotC r, WaitUntilConstraints r s eh check t)-  => check-  -> P.Sem r t+  :: forall (s :: EventType) r.+  ( BotC r, ReactConstraints s)+  => (EHType s -> Bool)+  -> P.Sem r (EHType s) waitUntil f = do   result <- P.embed newEmptyMVar-  remove <- react @s (curryG $ checker result)+  remove <- react @s (checker result)   res <- P.embed $ takeMVar result   remove   pure res   where-    checker :: MVar t -> t -> P.Sem r ()+    checker :: MVar (EHType s) -> EHType s -> P.Sem r ()     checker result args = do-      when (uncurryG f args) $ do+      when (f args) $ do         P.embed $ putMVar result args  -- | Wait until an event satisfying a condition happens, then returns it's@@ -255,7 +254,7 @@ -- And for @s ~ \''MessageUpdateEvt'@: -- -- @--- 'waitUntilM' :: ('Message' -> 'Message' -> 'P.Sem' r 'Bool') -> 'P.Sem' r ('Message', 'Message')+-- 'waitUntilM' :: (('Message', 'Message') -> 'P.Sem' r 'Bool') -> 'P.Sem' r ('Message', 'Message') -- @ -- -- ==== Examples@@ -267,20 +266,20 @@ --        print $ msg ^. #content -- @ waitUntilM-  :: forall (s :: EventType) r t eh ehB.-  ( BotC r, WaitUntilMConstraints r s eh ehB t)-  => ehB-  -> P.Sem r t+  :: forall (s :: EventType) r.+  ( BotC r, ReactConstraints s)+  => (EHType s -> P.Sem r Bool)+  -> P.Sem r (EHType s) waitUntilM f = do   result <- P.embed newEmptyMVar-  remove <- react @s (curryG $ checker result)+  remove <- react @s (checker result)   res <- P.embed $ takeMVar result   remove   pure res   where-    checker :: MVar t -> t -> P.Sem r ()+    checker :: MVar (EHType s) -> EHType s -> P.Sem r ()     checker result args = do-      res <- uncurryG f args+      res <- f args       when res $ do         P.embed $ putMVar result args @@ -382,7 +381,7 @@   Just oldChan <- DMChannel' <<$>> getDM (getID chan)   updateCache evt   Just newChan <- DMChannel' <<$>> getDM (getID chan)-  pure $ map (\f -> f oldChan newChan) (getEventHandlers @'ChannelUpdateEvt eh)+  pure $ map ($ (oldChan, newChan)) (getEventHandlers @'ChannelUpdateEvt eh)  handleEvent' eh evt@(ChannelUpdate (GuildChannel' chan)) = do   Just oldGuild <- getGuild (getID chan)@@ -390,18 +389,18 @@   updateCache evt   Just newGuild <- getGuild (getID chan)   Just newChan <- pure $ GuildChannel' <$> newGuild ^. #channels . at (getID chan)-  pure $ map (\f -> f oldChan newChan) (getEventHandlers @'ChannelUpdateEvt eh)+  pure $ map ($ (oldChan, newChan)) (getEventHandlers @'ChannelUpdateEvt eh)  handleEvent' eh evt@(ChannelDelete (GuildChannel' chan)) = do   Just oldGuild <- getGuild (getID chan)   Just oldChan <- pure $ GuildChannel' <$> oldGuild ^. #channels . at (getID chan)   updateCache evt-  pure $ map (\f -> f oldChan) (getEventHandlers @'ChannelDeleteEvt eh)+  pure $ map ($ oldChan) (getEventHandlers @'ChannelDeleteEvt eh)  handleEvent' eh evt@(ChannelDelete (DMChannel' chan)) = do   Just oldChan <- DMChannel' <<$>> getDM (getID chan)   updateCache evt-  pure $ map (\f -> f oldChan) (getEventHandlers @'ChannelDeleteEvt eh)+  pure $ map ($ oldChan) (getEventHandlers @'ChannelDeleteEvt eh)  -- handleEvent' eh evt@(ChannelPinsUpdate ChannelPinsUpdateData { channelID, lastPinTimestamp }) = do --   chan <- (GuildChannel' <$> os ^? #channels . at (coerceSnowflake channelID) . _Just)@@ -412,37 +411,37 @@   isNew <- not <$> isUnavailableGuild (getID guild)   updateCache evt   Just guild <- getGuild (getID guild)-  pure $ map (\f -> f guild (if isNew then GuildCreateNew else GuildCreateAvailable))+  pure $ map ($ (guild, (if isNew then GuildCreateNew else GuildCreateAvailable)))     (getEventHandlers @'GuildCreateEvt eh)  handleEvent' eh evt@(GuildUpdate guild) = do   Just oldGuild <- getGuild (getID guild)   updateCache evt   Just newGuild <- getGuild (getID guild)-  pure $ map (\f -> f oldGuild newGuild) (getEventHandlers @'GuildUpdateEvt eh)+  pure $ map ($ (oldGuild, newGuild)) (getEventHandlers @'GuildUpdateEvt eh)  -- NOTE: Guild will be deleted in the new cache if unavailable was false handleEvent' eh evt@(GuildDelete UnavailableGuild { id, unavailable }) = do   Just oldGuild <- getGuild id   updateCache evt-  pure $ map (\f -> f oldGuild (if unavailable then GuildDeleteUnavailable else GuildDeleteRemoved))+  pure $ map ($ (oldGuild, (if unavailable then GuildDeleteUnavailable else GuildDeleteRemoved)))     (getEventHandlers @'GuildDeleteEvt eh)  handleEvent' eh evt@(GuildBanAdd BanData { guildID, user }) = do   Just guild <- getGuild guildID   updateCache evt-  pure $ map (\f -> f guild user) (getEventHandlers @'GuildBanAddEvt eh)+  pure $ map ($ (guild, user)) (getEventHandlers @'GuildBanAddEvt eh)  handleEvent' eh evt@(GuildBanRemove BanData { guildID, user }) = do   Just guild <- getGuild guildID   updateCache evt-  pure $ map (\f -> f guild user) (getEventHandlers @'GuildBanRemoveEvt eh)+  pure $ map ($ (guild, user)) (getEventHandlers @'GuildBanRemoveEvt eh)  -- NOTE: we fire this event using the guild data with old emojis handleEvent' eh evt@(GuildEmojisUpdate GuildEmojisUpdateData { guildID, emojis }) = do   Just guild <- getGuild guildID   updateCache evt-  pure $ map (\f -> f guild emojis) (getEventHandlers @'GuildEmojisUpdateEvt eh)+  pure $ map ($ (guild, emojis)) (getEventHandlers @'GuildEmojisUpdateEvt eh)  handleEvent' eh evt@(GuildIntegrationsUpdate GuildIntegrationsUpdateData { guildID }) = do   updateCache evt@@ -467,19 +466,19 @@   updateCache evt   Just newGuild <- getGuild guildID   Just newMember <- pure $ newGuild ^. #members . at (getID user)-  pure $ map (\f -> f oldMember newMember) (getEventHandlers @'GuildMemberUpdateEvt eh)+  pure $ map ($ (oldMember, newMember)) (getEventHandlers @'GuildMemberUpdateEvt eh)  handleEvent' eh evt@(GuildMembersChunk GuildMembersChunkData { members, guildID }) = do   updateCache evt   Just guild <- getGuild guildID   let members' = guild ^.. #members . foldMap (at . getID) members . _Just-  pure $ map (\f -> f guild members') (getEventHandlers @'GuildMembersChunkEvt eh)+  pure $ map ($ (guild, members')) (getEventHandlers @'GuildMembersChunkEvt eh)  handleEvent' eh evt@(GuildRoleCreate GuildRoleData { guildID, role }) = do   updateCache evt   Just guild <- getGuild guildID   Just role' <- pure $ guild ^. #roles . at (getID role)-  pure $ map (\f -> f guild role') (getEventHandlers @'GuildRoleCreateEvt eh)+  pure $ map ($ (guild, role')) (getEventHandlers @'GuildRoleCreateEvt eh)  handleEvent' eh evt@(GuildRoleUpdate GuildRoleData { guildID, role }) = do   Just oldGuild <- getGuild guildID@@ -487,19 +486,19 @@   updateCache evt   Just newGuild <- getGuild guildID   Just newRole <- pure $ newGuild ^. #roles . at (getID role)-  pure $ map (\f -> f newGuild oldRole newRole) (getEventHandlers @'GuildRoleUpdateEvt eh)+  pure $ map ($ (newGuild, oldRole, newRole)) (getEventHandlers @'GuildRoleUpdateEvt eh)  handleEvent' eh evt@(GuildRoleDelete GuildRoleDeleteData { guildID, roleID }) = do   Just guild <- getGuild guildID   Just role <- pure $ guild ^. #roles . at roleID   updateCache evt-  pure $ map (\f -> f guild role) (getEventHandlers @'GuildRoleDeleteEvt eh)+  pure $ map ($ (guild, role)) (getEventHandlers @'GuildRoleDeleteEvt eh)  handleEvent' eh (InviteCreate d) = do-  pure $ map (\f -> f d) (getEventHandlers @'InviteCreateEvt eh)+  pure $ map ($ d) (getEventHandlers @'InviteCreateEvt eh)  handleEvent' eh (InviteDelete d) = do-  pure $ map (\f -> f d) (getEventHandlers @'InviteDeleteEvt eh)+  pure $ map ($ d) (getEventHandlers @'InviteDeleteEvt eh)  handleEvent' eh evt@(MessageCreate msg) = do   updateCache evt@@ -509,7 +508,7 @@   Just oldMsg <- getMessage (getID msg)   updateCache evt   Just newMsg <- getMessage (getID msg)-  pure $ map (\f -> f oldMsg newMsg) (getEventHandlers @'MessageUpdateEvt eh)+  pure $ map ($ (oldMsg, newMsg)) (getEventHandlers @'MessageUpdateEvt eh)  handleEvent' eh evt@(MessageDelete MessageDeleteData { id }) = do   Just oldMsg <- getMessage id@@ -524,12 +523,12 @@ handleEvent' eh evt@(MessageReactionAdd reaction) = do   updateCache evt   Just msg <- getMessage (getID reaction)-  pure $ map (\f -> f msg reaction) (getEventHandlers @'MessageReactionAddEvt eh)+  pure $ map ($ (msg, reaction)) (getEventHandlers @'MessageReactionAddEvt eh)  handleEvent' eh evt@(MessageReactionRemove reaction) = do   Just msg <- getMessage (getID reaction)   updateCache evt-  pure $ map (\f -> f msg reaction) (getEventHandlers @'MessageReactionRemoveEvt eh)+  pure $ map ($ (msg, reaction)) (getEventHandlers @'MessageReactionRemoveEvt eh)  handleEvent' eh evt@(MessageReactionRemoveAll MessageReactionRemoveAllData { messageID }) = do   Just msg <- getMessage messageID@@ -543,25 +542,25 @@   Just newGuild <- getGuild guildID   Just newMember <- pure $ newGuild ^. #members . at (coerceSnowflake userID)   let userUpdates = if oldMember ^. #user /= newMember ^. #user-                    then map (\f -> f (oldMember ^. #user) (newMember ^. #user)) (getEventHandlers @'UserUpdateEvt eh)+                    then map ($ ((oldMember ^. #user), (newMember ^. #user))) (getEventHandlers @'UserUpdateEvt eh)                     else mempty-  pure $ userUpdates <> map (\f -> f oldMember newMember) (getEventHandlers @'GuildMemberUpdateEvt eh)+  pure $ userUpdates <> map ($ (oldMember, newMember)) (getEventHandlers @'GuildMemberUpdateEvt eh)  handleEvent' eh (TypingStart TypingStartData { channelID, guildID, userID, timestamp }) =   case guildID of     Just gid -> do       Just guild <- getGuild gid       Just chan <- pure $ GuildChannel' <$> guild ^. #channels . at (coerceSnowflake channelID)-      pure $ map (\f -> f chan userID timestamp) (getEventHandlers @'TypingStartEvt eh)+      pure $ map ($ (chan, userID, timestamp)) (getEventHandlers @'TypingStartEvt eh)     Nothing -> do       Just chan <- DMChannel' <<$>> getDM (coerceSnowflake channelID)-      pure $ map (\f -> f chan userID timestamp) (getEventHandlers @'TypingStartEvt eh)+      pure $ map ($ (chan, userID, timestamp)) (getEventHandlers @'TypingStartEvt eh)  handleEvent' eh evt@(UserUpdate _) = do   Just oldUser <- getBotUser   updateCache evt   Just newUser <- getBotUser-  pure $ map (\f -> f oldUser newUser) (getEventHandlers @'UserUpdateEvt eh)+  pure $ map ($ (oldUser, newUser)) (getEventHandlers @'UserUpdateEvt eh)  handleEvent' _ e = fail $ "Unhandled event: " <> show e 
src/Calamity/Client/Types.hs view
@@ -9,8 +9,6 @@     , BotC     , SetupEff     , ReactConstraints-    , WaitUntilConstraints-    , WaitUntilMConstraints     , EventHandlers(..)     , InsertEventHandler(..)     , RemoveEventHandler(..)@@ -21,7 +19,6 @@ import           Calamity.Gateway.DispatchEvents ( CalamityEvent(..), InviteCreateData, InviteDeleteData, ReadyData ) import           Calamity.Gateway.Types          ( ControlMessage ) import           Calamity.HTTP.Internal.Types-import           Calamity.Internal.GenericCurry import           Calamity.Metrics.Eff import           Calamity.Types.LogEff import           Calamity.Types.Model.Channel@@ -79,44 +76,11 @@  -- | Some constraints that 'Calamity.Client.Client.react' needs to work. Don't -- worry about these since they are satisfied for any type @s@ can be-type ReactConstraints r s eh ehIO t =-  ( InsertEventHandler s-  , RemoveEventHandler s-  , eh ~ EHType s (P.Sem r) ()-  , ehIO ~ EHType s IO ()-  , Uncurry eh-  , Uncurried eh ~ (t -> P.Sem r ())-  , Curry (t -> IO ())-  , ehIO ~ Curried (t -> IO ()))---- | Some constraints that 'Calamity.Client.Client.waitUntil' needs to work. Don't--- worry about these since they are satisfied for any type @s@ can be-type WaitUntilConstraints r s eh check t =+type ReactConstraints s =   ( InsertEventHandler s   , RemoveEventHandler s-  , Uncurry eh-  , eh ~ EHType s (P.Sem r) ()-  , eh ~ Curried (t -> P.Sem r ())-  , Uncurry check-  , Uncurried check ~ (t -> Bool)-  , Curry (t -> IO ())-  , Curried (t -> IO ()) ~ EHType s IO ()   ) --- | Some constraints that 'Calamity.Client.Client.waitUntilM' needs to work. Don't--- worry about these since they are satisfied for any type @s@ can be-type WaitUntilMConstraints r s eh ehB t =-  ( InsertEventHandler s-  , RemoveEventHandler s-  , Uncurry eh-  , eh ~ EHType s (P.Sem r) ()-  , eh ~ Curried (t -> P.Sem r ())-  , Uncurry ehB-  , Uncurried ehB ~ (t -> P.Sem r Bool)-  , Curry (t -> IO ())-  , Curried (t -> IO ()) ~ EHType s IO ()-  )- newtype StartupError = StartupError String   deriving ( Show ) @@ -169,40 +133,40 @@  -- | A type family to decide what the parameters for an event handler should be -- determined by the type of event it is handling.-type family EHType (d :: EventType) m r where-  EHType 'ReadyEvt                    m r = ReadyData                                   -> m r-  EHType 'ChannelCreateEvt            m r = Channel                                     -> m r-  EHType 'ChannelUpdateEvt            m r = Channel   -> Channel                        -> m r-  EHType 'ChannelDeleteEvt            m r = Channel                                     -> m r-  EHType 'ChannelpinsUpdateEvt        m r = Channel   -> Maybe UTCTime                  -> m r-  EHType 'GuildCreateEvt              m r = Guild     -> GuildCreateStatus              -> m r-  EHType 'GuildUpdateEvt              m r = Guild     -> Guild                          -> m r-  EHType 'GuildDeleteEvt              m r = Guild     -> GuildDeleteStatus              -> m r-  EHType 'GuildBanAddEvt              m r = Guild     -> User                           -> m r-  EHType 'GuildBanRemoveEvt           m r = Guild     -> User                           -> m r-  EHType 'GuildEmojisUpdateEvt        m r = Guild     -> [Emoji]                        -> m r-  EHType 'GuildIntegrationsUpdateEvt  m r = Guild                                       -> m r-  EHType 'GuildMemberAddEvt           m r = Member                                      -> m r-  EHType 'GuildMemberRemoveEvt        m r = Member                                      -> m r-  EHType 'GuildMemberUpdateEvt        m r = Member    -> Member                         -> m r-  EHType 'GuildMembersChunkEvt        m r = Guild     -> [Member]                       -> m r-  EHType 'GuildRoleCreateEvt          m r = Guild     -> Role                           -> m r-  EHType 'GuildRoleUpdateEvt          m r = Guild     -> Role          -> Role          -> m r-  EHType 'GuildRoleDeleteEvt          m r = Guild     -> Role                           -> m r-  EHType 'InviteCreateEvt             m r = InviteCreateData                            -> m r-  EHType 'InviteDeleteEvt             m r = InviteDeleteData                            -> m r-  EHType 'MessageCreateEvt            m r = Message                                     -> m r-  EHType 'MessageUpdateEvt            m r = Message   -> Message                        -> m r-  EHType 'MessageDeleteEvt            m r = Message                                     -> m r-  EHType 'MessageDeleteBulkEvt        m r = [Message]                                   -> m r-  EHType 'MessageReactionAddEvt       m r = Message   -> Reaction                       -> m r-  EHType 'MessageReactionRemoveEvt    m r = Message   -> Reaction                       -> m r-  EHType 'MessageReactionRemoveAllEvt m r = Message                                     -> m r-  EHType 'TypingStartEvt              m r = Channel  -> Snowflake User -> UnixTimestamp -> m r-  EHType 'UserUpdateEvt               m r = User      -> User                           -> m r-  EHType ('CustomEvt s a)             m r = a                                           -> m r+type family EHType (d :: EventType) where+  EHType 'ReadyEvt                    = ReadyData+  EHType 'ChannelCreateEvt            = Channel+  EHType 'ChannelUpdateEvt            = (Channel, Channel)+  EHType 'ChannelDeleteEvt            = Channel+  EHType 'ChannelpinsUpdateEvt        = (Channel, Maybe UTCTime)+  EHType 'GuildCreateEvt              = (Guild, GuildCreateStatus)+  EHType 'GuildUpdateEvt              = (Guild, Guild)+  EHType 'GuildDeleteEvt              = (Guild, GuildDeleteStatus)+  EHType 'GuildBanAddEvt              = (Guild, User)+  EHType 'GuildBanRemoveEvt           = (Guild, User)+  EHType 'GuildEmojisUpdateEvt        = (Guild, [Emoji])+  EHType 'GuildIntegrationsUpdateEvt  = Guild+  EHType 'GuildMemberAddEvt           = Member+  EHType 'GuildMemberRemoveEvt        = Member+  EHType 'GuildMemberUpdateEvt        = (Member, Member)+  EHType 'GuildMembersChunkEvt        = (Guild, [Member])+  EHType 'GuildRoleCreateEvt          = (Guild, Role)+  EHType 'GuildRoleUpdateEvt          = (Guild, Role, Role)+  EHType 'GuildRoleDeleteEvt          = (Guild, Role)+  EHType 'InviteCreateEvt             = InviteCreateData+  EHType 'InviteDeleteEvt             = InviteDeleteData+  EHType 'MessageCreateEvt            = Message+  EHType 'MessageUpdateEvt            = (Message, Message)+  EHType 'MessageDeleteEvt            = Message+  EHType 'MessageDeleteBulkEvt        = [Message]+  EHType 'MessageReactionAddEvt       = (Message, Reaction)+  EHType 'MessageReactionRemoveEvt    = (Message, Reaction)+  EHType 'MessageReactionRemoveAllEvt = Message+  EHType 'TypingStartEvt              = (Channel, Snowflake User, UnixTimestamp)+  EHType 'UserUpdateEvt               = (User, User)+  EHType ('CustomEvt s a)             = a -type StoredEHType t = EHType t IO ()+type StoredEHType t = EHType t -> IO ()  newtype EventHandlers = EventHandlers (TypeRepMap EventHandler) @@ -290,7 +254,7 @@ intoDynFn :: forall a. Typeable a => (a -> IO ()) -> (Dynamic -> IO ()) intoDynFn fn = \d -> fn $ fromDynamicJust d -instance (Typeable a, Typeable s, Typeable (StoredEHType ('CustomEvt s a)), EHType ('CustomEvt s a) IO () ~ (a -> IO ()))+instance (Typeable a, Typeable s, Typeable (StoredEHType ('CustomEvt s a)), (EHType ('CustomEvt s a) -> IO ()) ~ (a -> IO ()))   => InsertEventHandler' 'True ('CustomEvt s a) where   makeEventHandlers' _ _ id' handler = EventHandlers . TM.one $ EH @('CustomEvt Void Dynamic)     (LH.singleton (typeRep $ Proxy @s) (LH.singleton (typeRep $ Proxy @a) [EventHandlerWithID id' (intoDynFn handler)]))
− src/Calamity/Internal/GenericCurry.hs
@@ -1,115 +0,0 @@--- | Generic arity curry/ uncurry-module Calamity.Internal.GenericCurry-    ( Curry(..)-    , Uncurry(..) ) where--import           Data.Typeable--import           GHC.TypeNats--class Curry t where-  type Curried t-  type Parameters t--  curryG :: t -> Curried t--type family CurryInstanceSelector t :: Nat where-  CurryInstanceSelector (a -> b -> c -> d -> e -> f -> r) = 6-  CurryInstanceSelector (a -> b -> c -> d -> e -> r) = 5-  CurryInstanceSelector (a -> b -> c -> d -> r) = 4-  CurryInstanceSelector (a -> b -> c -> r) = 3-  CurryInstanceSelector (a -> b -> r) = 2-  CurryInstanceSelector (a -> r) = 1--class Curry' (flag :: Nat) t where-  type Curried' (flag :: Nat) t-  type Parameters' (flag :: Nat) t--  curryG' :: Proxy flag -> t -> Curried' flag t--instance (CurryInstanceSelector t ~ flag, Curry' flag t) => Curry t where-  type Curried t = Curried' (CurryInstanceSelector t) t-  type Parameters t = Parameters' (CurryInstanceSelector t) t--  curryG = curryG' (Proxy @flag)--instance Curry' 6 ((a, b, c, d, e, f) -> r) where-  type Curried' 6 ((a, b, c, d, e, f) -> r) = a -> b -> c -> d -> e -> f -> r-  type Parameters' 6 ((a, b, c, d, e, f) -> r) = (a, b, c, d, e, f)--  curryG' _ fn a b c d e f = fn (a, b, c, d, e, f)--instance Curry' 5 ((a, b, c, d, e) -> r) where-  type Curried' 5 ((a, b, c, d, e) -> r) = a -> b -> c -> d -> e -> r-  type Parameters' 5 ((a, b, c, d, e) -> r) = (a, b, c, d, e)--  curryG' _ fn a b c d e = fn (a, b, c, d, e)--instance Curry' 4 ((a, b, c, d) -> r) where-  type Curried' 4 ((a, b, c, d) -> r) = a -> b -> c -> d -> r-  type Parameters' 4 ((a, b, c, d) -> r) = (a, b, c, d)--  curryG' _ fn a b c d = fn (a, b, c, d)--instance Curry' 3 ((a, b, c) -> r) where-  type Curried' 3 ((a, b, c) -> r) = a -> b -> c -> r-  type Parameters' 3 ((a, b, c) -> r) = (a, b, c)--  curryG' _ fn a b c = fn (a, b, c)--instance Curry' 2 ((a, b) -> r) where-  type Curried' 2 ((a, b) -> r) = a -> b -> r-  type Parameters' 2 ((a, b) -> r) = (a, b)--  curryG' _ fn a b = fn (a, b)--instance Curry' 1 (a -> r) where-  type Curried' 1 (a -> r) = a -> r-  type Parameters' 1 (a -> r) = a--  curryG' _ fn = fn--class Uncurry t where-  type Uncurried t--  uncurryG :: t -> Uncurried t--class Uncurry' (flag :: Nat) t where-  type Uncurried' (flag :: Nat) t--  uncurryG' :: Proxy flag -> t -> Uncurried' flag t--instance (CurryInstanceSelector t ~ flag, Uncurry' flag t) => Uncurry t where-  type Uncurried t = Uncurried' (CurryInstanceSelector t) t--  uncurryG = uncurryG' (Proxy @flag)--instance Uncurry' 6 (a -> b -> c -> d -> e -> f -> r) where-  type Uncurried' 6 (a -> b -> c -> d -> e -> f -> r) = (a, b, c, d, e, f) -> r--  uncurryG' _ fn (a, b, c, d, e, f) = fn a b c d e f--instance Uncurry' 5 (a -> b -> c -> d -> e -> r) where-  type Uncurried' 5 (a -> b -> c -> d -> e -> r) = (a, b, c, d, e) -> r--  uncurryG' _ f (a, b, c, d, e) = f a b c d e--instance Uncurry' 4 (a -> b -> c -> d -> r) where-  type Uncurried' 4 (a -> b -> c -> d -> r) = (a, b, c, d) -> r--  uncurryG' _ f (a, b, c, d) = f a b c d--instance Uncurry' 3 (a -> b -> c -> r) where-  type Uncurried' 3 (a -> b -> c -> r) = (a, b, c) -> r--  uncurryG' _ f (a, b, c) = f a b c--instance Uncurry' 2 (a -> b -> r) where-  type Uncurried' 2 (a -> b -> r) = (a, b) -> r--  uncurryG' _ f (a, b) = f a b--instance Uncurry' 1 (a -> r) where-  type Uncurried' 1 (a -> r) = a -> r--  uncurryG' _ f = f