From eeab2bb159432fbc68fa1eb4ea820381ae270ceb Mon Sep 17 00:00:00 2001 From: Jens Nolte <git@queezle.net> Date: Thu, 9 Sep 2021 21:18:36 +0200 Subject: [PATCH] Combine IsMessage generation --- src/Quasar/Wayland/Protocol/TH.hs | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/Quasar/Wayland/Protocol/TH.hs b/src/Quasar/Wayland/Protocol/TH.hs index 986f0eb..440cbd3 100644 --- a/src/Quasar/Wayland/Protocol/TH.hs +++ b/src/Quasar/Wayland/Protocol/TH.hs @@ -71,12 +71,10 @@ interfaceDec interface = execWriterT do tellQ $ instanceD (pure []) [t|IsInterface $iT|] instanceDecs when (length interface.requests > 0) do - tellQ $ messageTypeD rTypeName rConName (.messageSpec) interface.requests - tellQ $ messageInstanceD rT ((\req@(RequestSpec msg) -> (msg, rConName req)) <$> interface.requests) + tellQs $ messageTypeDecs rTypeName rConName (.messageSpec) interface.requests when (length interface.events > 0) do - tellQ $ messageTypeD eTypeName eConName (.messageSpec) interface.events - tellQ $ messageInstanceD eT ((\ev@(EventSpec msg) -> (msg, eConName ev)) <$> interface.events) + tellQs $ messageTypeDecs eTypeName eConName (.messageSpec) interface.events where iName = interfaceN interface @@ -99,14 +97,20 @@ interfaceDec interface = execWriterT do eConName :: EventSpec -> Name eConName (EventSpec event) = mkName $ "E_" <> interface.name <> "_" <> event.name -messageTypeD :: forall a. Name -> (a -> Name) -> (a -> MessageSpec) -> [a] -> Q Dec -messageTypeD name conName msgSpec msgs = dataD (pure []) name [] Nothing (con <$> msgs) [derivingEq, derivingShow] +messageTypeDecs :: forall a. Name -> (a -> Name) -> (a -> MessageSpec) -> [a] -> Q [Dec] +messageTypeDecs name conName msgSpec msgs = execWriterT do + tellQ $ messageTypeD + tellQ $ isMessageInstanceD t ((\msg -> (msgSpec msg, conName msg)) <$> msgs) where + t :: Q Type + t = conT name + messageTypeD :: Q Dec + messageTypeD = dataD (pure []) name [] Nothing (con <$> msgs) [derivingEq, derivingShow] con :: a -> Q Con con msg = normalC (conName msg) (defaultBangType <$> messageArgTs (msgSpec msg)) -messageInstanceD :: Q Type -> [(MessageSpec, Name)] -> Q Dec -messageInstanceD t messages = instanceD (pure []) [t|IsMessage $t|] [opcodeNameD, showMessageD, getMessageD, putMessageD] +isMessageInstanceD :: Q Type -> [(MessageSpec, Name)] -> Q Dec +isMessageInstanceD t messages = instanceD (pure []) [t|IsMessage $t|] [opcodeNameD, showMessageD, getMessageD, putMessageD] where opcodeNameD :: Q Dec opcodeNameD = funD 'opcodeName (opcodeNameClauseD <$> messages) -- GitLab