úÎjİc^      Safe2579;HState monad providing context, i.e. function we've already called before.datatype for a token returning a random string$Pretoken, aka token as first read in dataype for a key aka token name0datatype for a double representing a probability@Compare inside the state monad using only the underlying objectsMake N a monoid so we can append them together nicely (since they do generate text). d(Value "Hello") <> (List [(0.5," you"), (0.5, " me")]) (List [(0.5,"Hello you"), (0.5, "Hello me")])  None2579; Drop file Extension"Get directory associated to a file 1Function to apply a value on both arguments, e.g. between .$ (char '"')!ĈAdd a PR for this? Could be useful in Megaparsec idk Allows us to use monoidal addition on parsers instance (Monoid a) => Monoid (Parser a) where mempty = pure mempty mappend x y = mappend  $ x  * y0Normalize pre-tokens/corresponding probabilities"-Helper function for creating a cdf from a pdf#Show as a T.Text$Pretty-print a ParseError%Strip a pre-token's name&Read a file in as a Text  !"#$%&  !"#$%&  !"#$%&None257:Datatype for a semantic error'5Throw custom error given by string, within the parser(Throw  error within parser)+Throws argument for circular function calls*-Throws error when a function is defined twice+'Throws error for insufficient arguments,Constant to start s- Convert a Text to a . for use with a pretty-printer/*big semantics checker that sequences stuff0'helper to filter out stuff that doesn't1fTake the head of the list, or throw the appropriate error given which functions we are trying to call.29Access argument, or throw error if the list is too short.3'checker to verify there is at most one :return or  :define key statement4 Checks that we have at most one  `:return` template in the file5+Checks that there are no instances of a key6Derived via our show instance;7 display a ! nicely with coloration & whatnot 8'9(:)*+,-/01;234567  8/1;2 8'9(:)*+,-/01;234567None257  Generate randomized text from a  †getText :: IO T.Text getText = do let exampleTok = List [(1.0,List [(0.5,Value "heads"),(0.5,Value "tails")])] run exampleTok <5Helper function to compute the cdf when we have a pdf <  <Safe257=Draw as a syntax Tree>Function to transform a 8 into a `Tree String` so that it can be pretty-printed. tokToTree 1.0 tok=>==>None257 ?(A map with all the modifiers for Madlang@Jumble the words in a stringAStrip file extensionBGet the :return valueC(Convert the stuff after the number to a D5Build token in tree structure, without concatenating.E2Build the token without concatenating, yielding a # suitable to be printed as a tree.F+Given keys naming the tokens, and lists of  , build our GPSort the keys that we have parsed so that dependencies are in the correct placesH.Ordering on the keys to account for dependency ?@ABCDEFGIJHK?@ABEFG ?@ABCDEFGIJHKNone257L0Parse a lexeme, aka deal with whitespace nicely.M*space consumer with awareness for commentsN6parse a symbol, i.e. string plus surrouding whitespaceOParse a number/probabilityPParse an integerQ-Make sure definition blocks start un-indentedR0Make contents of definition blocks are indented.SParse between quotesTParse a keywordU Parse a varV Parse the V keyword.W Parse the X keyword.Y Parse the Y keyword.Z Parse the  `:return` keyword.[&Parse a template name (what follows a  `:define` or \ block)]Parse a modifier^Parse template into a  of referents and strings_*Parse a probability/corresponding template`Parse a function name for a  `:category` block.a Parse an YbParse a V blockXParse a X blockc Parse the  `:return` blockdParse the program in terms of  and the s to link them. QParse text as a token + context (aka a reader monad with all the other functions)eParse text as token + contextf!Parse text as a list of functionsg@Parse text as a list of tokens, suitable for printing as a tree. Parse text given a context }import qualified Data.Text.IO as TIO getParsed = do f <- TIO.readFile "template.mad" parseTok "filename.mad" [] [] fh8Parse text as a token, suitable for printing as a tree..iParse inclustionsLMNOPQRSTUVWYZ[]^_`abXcd efg !File name to use for parse errors2Context, i.e. other random data paired with a key.1list of variables to substitute into the templateActaul text to parseResulthi fg hiLMNOPQRSTUVWYZ[]^_`abXcd efg hi None257: Parse a template file into the  data typej'Generate text from file with inclusions:Generate randomized text from a file containing a templatekRun in the appropriate folder-Run based on text input, with nothing linked.lGet file as contextBParse a template into a RandTok suitable to be displayed as a tree )variables to substitute into the templatefolderfilepath within folderparsed j1List of variables to substitute into the templatePath to .mad file.Resultkl  jkl None257m for an EDSL, e.g. xdemoQQ :: T.Text demoQQ = run [madlang| :define something 1.0 "hello" 1.0 "goodbye" :return 1.0 something|] nNote that this is in general much faster than running interpreted code, though inclusions do not work in the m or in spliced expressions.n Convert a o6 containing to a `Q Exp` with the parsed syntax tree.p_Turn a parse error into an error that will be caught when Template Haskell compiles at runtime.Splice for embedding a '.mad' file, e.g. >demo :: IO T.Text demo = run $(madFile "twitter-bot.mad") 7Note that the embedded code cannot have any inclusions.npnp Safe257 qrstuvwxyz{|}rxyz{|} qrstuvwxyz{|} None257~datatype for the subcommandsdatatype for the program€/Parser for command-line options for the programParser for the run subcommand‚Parser for the lint subcommandMain program actionExample Usage: -$ madlang run example.mad some text generatedƒWraps parser with help parser„7given a parsed record perform the appropriate IO action~…†‡ˆ‰Š‹Œ€‚Žƒ„ ~ …†‡ˆ‰ŠˆŠˆ‹Œ€‚Žƒ„None257             !"#$%&!'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxy z { |}~ €jk ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ  Ž   ‘ ’ “ ” • – — ˜ ™ š › œ ‘  ž Ÿ &madlang-2.4.1.2-6bLR21AyfuY7dUq3mtrr86 Text.MadlibsText.Madlibs.Internal.TypesText.Madlibs.Internal.UtilsText.Madlibs.Cata.SemErrText.Madlibs.Cata.RunText.Madlibs.Cata.DisplayText.Madlibs.Ana.ParseUtilsText.Madlibs.Ana.ParseText.Madlibs.Ana.ResolveText.Madlibs.Generate.TH Paths_madlangText.Madlibs.Exec.MainContextRandTokListValue SemanticErrorNoReturnCircularFunctionCallsInsufficientArgsDoubleDefinition NoContextrun parseTokMparseTok parseFilerunFilerunTextmakeTreemadlangmadFile runMadlangPreTokKeyProb $fEqStateT$fMonoidRandTokNameapply $fEqPreTok $fShowPreTok dropExtensiongetDir.$ normalizecdfshow'parseErrorPretty'unTok readFile' customErrornoReturncircularFunctionCallsdoubleDefinitioninsufficientArgs semErrStarttext'-ansi-wl-pprint-0.6.8.1-AloTw2NbGBFHl1luttZjPa%Text.PrettyPrint.ANSI.Leijen.InternalDoccheckSemanticssumProbhead'accesscheckKeysingleInstance noInstance$fExceptionSemanticError$fShowSemanticErrorParsershowCustomError noContext headNoReturnmkCdf displayTree tokToTree modifierListjumblestrip takeTemplate concatTokbuildTok buildTreebuildsortKeys orderKeys orderHelper hasNoDepsflattenlexeme spaceConsumersymbolfloatinteger nonIndented indentGuardquotekeywordvardefinecatcategoryincludemainnamebaseGHC.BasereturnmodifierpreStrpairfunction inclusions definitionfinalprogram parseTreeM parseTokF parseTreeF parseTreeparseInclusionsgetInclusionCtx runInFolderparseCtxtemplate-haskellLanguage.Haskell.TH.Quote QuasiQuotertextToExpressionStringerrorgencatchIOversionbindirlibdirdatadir libexecdir sysconfdir getBinDir getLibDir getDataDir getLibexecDir getSysconfDirgetDataFileName SubcommandProgramorderstemplintwrappertemplateDebugRunLintinput_repclInputssubdebug versionInfo