;2z      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnop q r s t u v w x y portable (template-haskell) experimentalMatt Morrow <mjm2002@gmail.com>% TH doesn' t handle:  * implicit params  !"#$zTH does' t handle  * unboxed tuples  * implicit params  * infix type constructors  * kind signatures ) {|} !"#$~$   !"#$$    !"#$portable (template-haskell) experimentalMatt Morrow <mjm2002@gmail.com>%&'(%&'(%&'(%&'(&'( portable (template-haskell) experimentalMatt Morrow <mjm2002@gmail.com> portable (template-haskell) experimentalMatt Morrow <mjm2002@gmail.com>- {|} !"#$~%&'(portable (template-haskell) experimentalMatt Morrow <mjm2002@gmail.com>)*+,-./012345678)*+,-./012345678)*+,-./012345678)*+,-./012345678 portable (template-haskell) experimentalMatt Morrow <mjm2002@gmail.com>= {|} !"#$~%&'()*+,-./01234567839.The strategy for producing QuasiQuoters which 2 this datatype aims to facilitate is as follows. 0 Given a collection of datatypes which make up 1 the to-be-quasiquoted languages AST, make each 2 type in this collection an instance of at least  Show and Lift. Now, assuming parsePat and  parseExp, both of type  String -> Q a (where a 5 is the top level type of the AST), are the pair of 7 functions you wish to use for parsing in pattern and 3 expression context respectively, put them inside  a Quoter$ datatype and pass this to quasify. :;<=>The type passed in must have a Show instance which 8 produces a valid Haskell expression. Returns an empty  String3 if this is not the case. This is not TH-specific,  but useful in general. ?@AB unQ = unsafePerformIO . runQCDEFGHIJK#renameT applied to a list of types LERename type variables in the Type according to the given association @ list. Normalise constructor names (remove qualification, etc.) J If a name is not found in the association list, replace it with one from F the fresh names list, and add this translation to the returned list. E The fresh names list should be infinite; myNames is a good example. MRemove qualification, etc. NOPProduces pretty code suitable  for human consumption. QRSTUVWXYZ[\The arity of a Type. ]^Randomly useful. _`abcdefghijk39:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk3=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcde9:;<fghijk39:;<:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkl  ghci> [$hs|\x -> (x,x)|] 42  (42,42) * ghci> (\[$hs|a@(x,_)|] -> (a,x)) (42,88)  ((42,88),42) mlmlmlmnnnnoooo !pqrpqrpqrpqr stuvwxystuvwxysxwvutysxwvuttuvwxy !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{ | } ~       hJ                haskell-src-meta-0.1.0Language.Haskell.Meta.QQ.Here&Language.Haskell.Meta.Syntax.Translate!Language.Haskell.Meta.Syntax.VarsLanguage.Haskell.Meta.ParseLanguage.Haskell.Meta.UtilsLanguage.Haskell.Meta.QQ.HsLanguage.Haskell.Meta.QQ.HsHereLanguage.Haskell.Meta.QQ.IdiomLanguage.Haskell.Meta.QQ.BFLanguage.Haskell.Meta.QQ.SKI"Language.Haskell.TH.Instances.LiftLanguage.Haskell.Meta.SyntaxLanguage.Haskell.MetahereToLoctoLocToStmttoStmtToDectoDecToDecstoDecsToExptoExpToPattoPatToTypetoTypeToLittoLitToNametoNameerrorMsg toFieldExptoKindtoTyVar.->.toCxtfoldAppT hsBindsToDecshsBangTypeToStrictTypequalConDeclToCon conDeclToConbangToVarStrictTypesbangToStrictTypehsMatchesToFunDhsMatchToClause hsRhsToBodyhsGuardedRhsToBody hsStmtToGuardVarsvarsfvsbvsparsePatparseExp parseType parseDecsmyDefaultParseModemyDefaultExtensionsparseResultToEither parseHsModule parseHsDecls parseHsType parseHsExp parseHsPat pprHsModule moduleDecls emptySrcLoc emptyHsModuleQuoterexpQpatQ cleanNamesprettyppppDocgprettyunQnameToRawCodeStr|$||.||->|unForall functionTmkVarTmyNamesrenameTsrenameT normaliseNameapplyTsubstTderiveLiftPrettysplitCon strictTypeTyvarStrictTypeTyconTypes conToConTypedecCons decTyVarsdecName foreignNameunwindTunwindEarityT typeToName nameSpaceOfconNamerecCName dataDCons fromDataConI fromTyConImkFunD mkClauseQquasifytoExpQtoPatQ showToPatQeitherQ normalizeThspatibfbf2 bfHelloWorldSKI:$EIKSski $fToTypeTypetoMatchtoBodytoGuard collectVars fixForall transformE transformPHereManyHTextHCodeHliftHerehereExpQherePatQrunparsehereP mergeTextsonePrunPskiplexemePnestedP applicateQStatusRWDBfWhileMovRMovLDecIncOutInpMemPtrbf2ExpQbfExpQbfPatQeval_evalexecstepinitMemincdecrdwrupdskiExpQskiPatQskiPspliceP