úÎGū=Û~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs t u v w x y z { | } portable (template-haskell) experimentalMatt Morrow <mjm2002@gmail.com>' TH doesn' t handle:  * implicit params  !"#$%&~TH 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>+,-./0123456789:+,-./0123456789:+,-./0123456789:+,-./0123456789:portable (template-haskell) experimentalMatt Morrow <mjm2002@gmail.com>=  !"#$%&€'()*+,-./0123456789:3;.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. ABCD unQ = unsafePerformIO . runQEFGHIJKL5Infinite list of names composed of lowercase letters MGeneralisation of renameTs #renameT applied to a list of types NERename 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. ORemove qualification, etc. PQRProduces pretty code suitable  for human consumption. STUVWXYZ[\]^The arity of a Type. _`Randomly useful. abcdefghijklm4;<=>?@ABCDEFGHIJKL‚MNOPQRSTUVWXYZ[\]^_`abcdefghijklm3?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg;<=>hijklm3;<=><=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnUsage:  / ghci> [$ado| a <- "foo"; b <- "bar"; (a,b) |] ] [('f','b'),('f','a'),('f','r'),('o','b'),('o','a'),('o','r'),('o','b'),('o','a'),('o','r')] E ghci> [$ado| Just a <- [Just 1,Nothing,Just 2]; b <- "fo"; (a,b) |] G [Just (1,'f'),Just (1,'o'),Nothing,Nothing,Just (2,'f'),Just (2,'o')] o Variant of n> that does not implicitly add a Maybe when patterns may fail: F ghci> [$ado'| Just a <- [Just 1,Nothing,Just 2]; b <- "fo"; (a,b) |] 3 [(1,'f'),(1,'o'),*** Exception: <interactive>:... ƒ„…†‡nononop  ghci> [$hs|\x -> (x,x)|] 42  (42,42) * ghci> (\[$hs|a@(x,_)|] -> (a,x)) (42,88)  ((42,88),42) ˆ‰qpqpqpqŠ‹Œr Example:  & a x = [$here| random "text" $(x + 1)  something else|]  Is like: A a x = " random \"text\" "++ show (x + 1) ++"\n something else" Ž‘’“”•–—˜™rrr sš›œsss !žŸ ĄĸŖ¤Ĩϧ¨ŠĒĢtuŦ­Žv¯°ą˛ŗ´ĩšētuvtuvtuv wxyz{|ģŧ}ŊžŋĀÁÂÃÄÅÆwxyz{|}w|{zyx}w|{zyxxyz{|}Į !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ €  ‚ ƒ „ … † ‡ ˆ ‰ Š‹ŒŽ‘’“”•–—˜™š›œžŸ ĄĸŖ¤ĨĻ § k M ¨ Š Ē Ģ Ŧ ­ Ž ¯ ° ą ˛ ŗ ´ ´ ĩ ļ ˇ ¸ š ē ģ ž ŧ Ŋ ž ŋ Ā Á  Ÿ ž ē Ã Ä Ÿ Å ĸ Æ Ŗ ¤ Ĩ ĻĮhaskell-src-meta-0.2Language.Haskell.Meta.QQ.Here&Language.Haskell.Meta.Syntax.Translate!Language.Haskell.Meta.Syntax.VarsLanguage.Haskell.Meta.ParseLanguage.Haskell.Meta.UtilsLanguage.Haskell.Meta.QQ.ADoLanguage.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 toFieldExptoMatchtoBodytoKindtoTyVar.->.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 normalizeTadoado'hspatibfbf2 bfHelloWorldSKI:$EIKSski $fToTypeTypetoGuard collectVars fixForall renameThingsado''parseDo applicatefailingPatterns singleCon transformE transformPHereManyHTextHCodeHliftHerehereExpQherePatQrunparsehereP mergeTextsonePrunPskiplexemePnestedP applicateQStatusRWDBfWhileMovRMovLDecIncOutInpMemPtrbf2ExpQbfExpQbfPatQeval_evalexecstepinitMemincdecrdwrupdskiExpQskiPatQskiPspliceP