*l$wt      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij k l m n o p q r s  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>#  !"#portable (template-haskell) experimentalMatt Morrow <mjm2002@gmail.com>$%&'()*+,-./0123$%&'()*+,-./0123$%&'()*+,-./0123 portable (template-haskell) experimentalMatt Morrow <mjm2002@gmail.com>3  !"#$%&'()*+,-./01234.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. 9The 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. = unQ = unsafePerformIO . runQIStolen from Igloo' s th-lift. JProduces pretty code suitable  for human consumption. VThe arity of a Type. XRandomly useful. 3456789:;<=>?@ABCDEtFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcde289:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_4567`abcde2456756789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef  ghci> [$hs|\x -> (x,x)|] 42  (42,42) * ghci> (\[$hs|a@(x,_)|] -> (a,x)) (42,88)  ((42,88),42) fgfgfghhhiii jkljkljkl mnopqrsmrqponsmrqponnopqrsu !"#$%&'()*+,-./0123456789:;<=>?@ABBCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu v w x y z { | } ~ haskell-src-meta-0.0.5Language.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.MetahereToLoctoLocToStmttoStmtToDectoDecToExptoExpToPattoPatToTypetoTypeToLittoLitToNametoNameerrorMsg toFieldExp.->.foldAppT hsBindsToDecshsBangTypeToStrictTypequalConDeclToCon conDeclToConbangToVarStrictTypesbangToStrictTypehsMatchesToFunDhsMatchToClause hsRhsToBodyhsGuardedRhsToBody hsStmtToGuardVarsvarsfvsbvsparsePatparseExp parseType parseDecsmyDefaultParseModemyDefaultExtensionsparseResultToEither parseHsModule parseHsDecls parseHsType parseHsExp parseHsPat pprHsModule moduleDecls emptySrcLoc emptyHsModuleQuoterexpQpatQ cleanNamesprettyppppDocgprettyunQnameToRawCodeStr|$||.||->|unForall functionTmkVarTmyNamesrenameTapplyTsubstT deriveLiftderiveLiftPrettysplitCon strictTypeTyvarStrictTypeTyconTypes conToConTypedecCons decTyVarsdecName foreignNameunwindTunwindEarityT typeToName nameSpaceOfconNamerecCName dataDCons fromDataConI fromTyConImkFunD mkClauseQquasifytoExpQtoPatQ showToPatQeitherQ normalizeThspatibfbf2 bfHelloWorldSKI:$EIKSskirenameTs