0+      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                                  ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L MNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~! Safe-Inferred -Nested lists to represent scoping structure. 9A simple expression language AST, for things parsed from  or JSON structures.  Application. Commands (to be looked up in  !). (Variable names (refers to source code). &Count the total number of statements. &Count the total number of statements. Parse an expression. 5Parse a list of statements, seperated by semicolons.            None0Unlike everything else, there is no synonym for  $ provided by GHC, so we define one. IA (potentially recursive) definition is an identifier and an expression. 6 In GHC Core, recursive definitions are encoded as (,  ) pairs. ! This data type is isomorphic. 3A program is a telescope of nested binding groups. C That is, each binding scopes over the remainder of the program. ) In GHC Core, programs are encoded as []. ! This data type is isomorphic. 0A binding group and the program it scopes over. An empty program. RCore is the sum type of all nodes in the AST that we wish to be able to traverse.  All Node" instances in HERMIT define their Generic type to be . A case alternative. An expression. A recursive definition. A binding group. 5A program (a telescope of top-level binding groups).  The module. 'Get the list of bindings in a program. )Build a program from a list of bindings. ` Note that bindings earlier in the list are considered scope over bindings later in the list. Extract the list of identifier/'expression pairs from a binding group. %Convert a definition to an identifier/expression pair. !VConvert a list of recursive definitions into an (isomorphic) recursive binding group. "'Succeeds if the expression is either a  or type . # Convert a  expression that is a  into a . $GHC's * function throws an error if applied to a  (but, inconsistently, return a ! if applied to a type variable).  This function returns the  of a , but otherwise behaves as . %)Count the number of nested applications.  !"#$% !"#$%! "#$%  !"#$%"None 2Convert a variable to a neat string for printing. Converts a GHC  to a Template Haskell , going via a .  Converts an  to a Template Haskell , going via a . &Get the unqualified name from an Var. 8Hacks until we can find the correct way of doing these. 8Hacks until we can find the correct way of doing these. 8Hacks until we can find the correct way of doing these. 8Hacks until we can find the correct way of doing these. =This is hopeless O(n), because the we could not generate the s that match,  for use of the GHC . Pretty-print an identifier.       None&ZThe HERMIT context, containing all bindings in scope and the current location in the AST. G The bindings here are lazy by choice, so that we can avoid the cost / of building the context if we never use it. '#All (important) bindings in scope. (The depth of the bindings. )The $ to the current node from the root. *The  of the current module. +HERMIT''s representation of variable bindings. ,EFor case wildcard binders. We store both the scrutinised expression,  and the case alternative E (which can be converted to Constructor or Literal) and identifiers. -.For a lambda binding you only know the depth. .<Binding depth, whether it is recursive, and the bound value B (which cannot be inlined without checking for scoping issues). /Get the depth of a binding. 0Create the initial HERMIT & by providing a . 1+Update the context by extending the stored  to a child. 22Add all bindings in a binding group to a context. 32Add the bindings for a specific case alternative. 4*Add a lambda bound variable to a context. B All that is known is the variable, which may shadow something.  If so, we don'@t worry about that here, it is instead checked during inlining. 5Add the identifiers bound by a " in a case. Like lambda bindings, F in that we know nothing about them, but all bound at the same depth,  so we cannot just fold 4 over the list. 60Lookup the binding for a variable in a context. 7+List all the variables bound in a context. 8/Determine if a variable is bound in a context. 9CList all variables bound in the context that match the given name. The HERMIT context stores an " to the current node in the tree. &'()*+,-./0123456789&'()*+,-./0123456789&'()*015234'()*6789+.-,/&'()*+.-,/0123456789None:A message packet. =#The HERMIT monad is kept abstract. >'A way of sending messages to top level AA store of saved definitions. B#A label for individual defintions. C$Get the stash of saved definitions. (Replace the stash of saved definitions. E"Save a definition for future use. F&Lookup a previously saved definition. GEliminator for =. H can be lifted to =. IHMake a unique identifier for a specified type based on a provided name. JKMake a unique type variable for a specified kind based on a provided name. KThis gives an new version of a ., with the same info, and a new textual name. :;<=>?@ABCDEFGHIJKL !"#$%&':;<=>?@ABCDEFGHIJKL=GHIJKBAEFC>?@:<;LD:<;=>?@ABCDEFGHIJKL !"#$%&'NoneTPVA synonym for the identity rewrite. Convienient to avoid importing Control.Category. QTranslate a module. ~ Slightly different to the other congruence combinators: it passes in *all* of the original to the reconstruction function. R Rewrite the  child of a module. STranslate an empty list. T"Translate a program of the form: ( : ) U0Rewrite all children of a program of the form: ( : ) V0Rewrite any children of a program of the form: ( : ) W-Rewrite one child of a program of the form: ( : ) X'Translate a binding group of the form: NonRec   Y Rewrite the ' child of a binding group of the form: NonRec   Z'Translate a binding group of the form: Rec [] [5Rewrite all children of a binding group of the form: Rec [] \5Rewrite any children of a binding group of the form: Rec [] ]2Rewrite one child of a binding group of the form: Rec [] ^.Translate a recursive definition of the form: Def   _ Rewrite the . child of a recursive definition of the form: Def   `+Translate a case alternative of the form: (, [], ) a Rewrite the + child of a case alternative of the form: (, , ) b%Translate an expression of the form: Var  c%Translate an expression of the form: Lit ( d%Translate an expression of the form: App   e3Rewrite all children of an expression of the form: App   f3Rewrite any children of an expression of the form: App   g0Rewrite one child of an expression of the form: App   h%Translate an expression of the form: Lam   i Rewrite the % child of an expression of the form: Lam   j%Translate an expression of the form: Let   k3Rewrite all children of an expression of the form: Let   l3Rewrite any children of an expression of the form: Let   m0Rewrite one child of an expression of the form: Let   n%Translate an expression of the form: Case    [)] o3Rewrite all children of an expression of the form: Case    [)] p3Rewrite any children of an expression of the form: Case    [)] q0Rewrite one child of an expression of the form: Case    [)] r%Translate an expression of the form: Cast  * s Rewrite the % child of an expression of the form: Cast  * t%Translate an expression of the form: Tick   u Rewrite the % child of an expression of the form: Tick   v%Translate an expression of the form: Type  w%Translate an expression of the form: Coercion * x'Translate a binding group of the form: Rec [(, )] y5Rewrite all children of a binding group of the form: Rec [(, )] z5Rewrite any children of a binding group of the form: Rec [(, )] {2Rewrite one child of a binding group of the form: Rec [(, )] |"Translate a program of the form: (NonRec  ) :  }4Rewrite all children of an expression of the form: (NonRec  ) :  ~4Rewrite any children of an expression of the form: (NonRec  ) :  1Rewrite one child of an expression of the form: (NonRec  ) :  &Translate an expression of the form: (Rec []) :  4Rewrite all children of an expression of the form: (Rec []) :  4Rewrite any children of an expression of the form: (Rec []) :  1Rewrite one child of an expression of the form: (Rec []) :  &Translate an expression of the form: (Rec [(, )]) :  4Rewrite all children of an expression of the form: (Rec [(, )]) :  4Rewrite any children of an expression of the form: (Rec [(, )]) :  1Rewrite one child of an expression of the form: (Rec [(, )]) :  %Translate an expression of the form: Let (NonRec  )  3Rewrite all children of an expression of the form: Let (NonRec  )  3Rewrite any children of an expression of the form: Let (NonRec  )  0Rewrite one child of an expression of the form: Let (NonRec  )  %Translate an expression of the form: Let (Rec [])  3Rewrite all children of an expression of the form: Let (Rec [])  3Rewrite any children of an expression of the form: Let (Rec [])  0Rewrite one child of an expression of the form: Let (Rec [])  %Translate an expression of the form: Let (Rec [(, )])  3Rewrite all children of an expression of the form: Let (Rec [(, )])  3Rewrite any children of an expression of the form: Let (Rec [(, )])  0Rewrite one child of an expression of the form: Let (Rec [(, )])  %Translate an expression of the form: Case    [(, [], )] 3Rewrite all children of an expression of the form: Case    [(, [], )] 3Rewrite any children of an expression of the form: Case    [(, [], )] 0Rewrite one child of an expression of the form: Case    [(, [], )] Promote a rewrite on  to a rewrite on . Promote a rewrite on  to a rewrite on . Promote a rewrite on  to a rewrite on . Promote a rewrite on  to a rewrite on . Promote a rewrite on ) to a rewrite on . Promote a rewrite on  to a rewrite on . Promote a translate on  to a translate on . Promote a translate on  to a translate on . Promote a translate on  to a translate on . Promote a translate on  to a translate on . Promote a translate on ) to a translate on . Promote a translate on  to a translate on . pMNOPQRS+TUVWXY,Z[\]^_`abc-defghi.jklm/nopqrstuvwxyz{|}~0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~MNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ZONMPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~pMNOPQRS+TUVWXY,Z[\]^_`abc-defghi.jklm/nopqrstuvwxyz{|}~0123456789:;<=>?@ABCNone+*The class of things that can be made into s.  To be an  there must exist an isomorphic  type that is an instance of . An isomorphic wrapper. Wrap a value in a . Unwrap a value from a . An  is a D value with some associated meta-data (name, help string and tags). Get the name of an . Get the  value stored in an . Get the list of help  s for an .  List all the s associated with an  "Tags are meta-data that we add to (s to make them sortable and searchable. Add a  to an .  Remove a  from an .  Check if an  has the specified . +A data type of logical operations on tags. 7Requirement: commands cannot have the same name as any  , (or the help function will not find it).  These should be  user facing, because they give the user : a way of sub-dividing our confusing array of commands. Things we are trying out. +Something is not finished yet, do not use.  TODO: check before the release. -a command that uses its context, like inline Commands that are run by #$. Version control. Commands to help debugging. Operation has a precondition. It's all about the commute. &Introduce something, like a new name.  Something that passes or fails. A question we ask. Uses y or  to focus onto something. O(1) O(n) $Command may operate multiple times. %& command. *The arrow of evaluation (reduces a term). Shell command. Help information for Fs is stored as a list of strings, designed for multi-line displaying.  names are just strings. ?Lists all the tags paired with a short description of what they' re about. An "and" on s. An "or" on s. A "not" on s. The primitive way to build an . Build a '( from names to  values. Build a '(! from names to help information. L;?!NoneAn  a is a possible means of converting a  value to a value of type a.  Interpret an  by looking up the appropriate (s) in the provided '(, then interpreting the (s) with the provided Ws, returning the first interpretation to succeed (or an error string if none succeed). !The primitive way of building an . None None*s involving navigating to named entities. AFind the path to the RHS of the binding group of the given name. 6Find the path to the definiiton of the provided name. >Find the path to the RHS of the definition of the given name. =Verify that this is a binding group defining the given name. 6Verify that this is the definition of the given name. !Find all the possible targets of "consider". hLookup table for constructs that can be considered; the keys are the arguments the user can give to the "consider" command.    Nonenotes might be added to output Use css to do the colors  -  - >  styletype="text/css"  - > .hermit-syntax {  - > color: red;  - >  /style U      !"#$%&'()*+,-./0  F      !"#$%&'()*+,-./0F# "!$%&'()     *+,-./0,      "!#$%&'()*+,-./0  None27like vcat and hcat, only make the list syntax explicit 37like vcat and hcat, only make the list syntax explicit 1234123412341234 None=7like vcat and hcat, only make the list syntax explicit >7like vcat and hcat, only make the list syntax explicit 56789:;<=>?@ABCDEFGH56789:;<=>?@ABCDEFGH<=>5;:9876?@ABCDEFGH5;:9876<=>?@ABCDEFGH NoneJ7like vcat and hcat, only make the list syntax explicit K7like vcat and hcat, only make the list syntax explicit IJKLIJKLIJKLIJKLNoneMMMMNoneNExposed debugging s. OIf the  fails, print out the , with a message. PPrint out the , with a message. Q4Just say something, every time the rewrite is done. NOPQNOPQNQPONOPQNoneRIExternals that reflect GHC functions, or are derived from GHC functions. ScSubstitute all occurrences of a variable with an expression, in either a program or an expression.  OSubstitute all occurrences of a variable with an expression, in an expression.  KSubstitute all occurrences of a variable with an expression, in a program. T(let x = e1 in e2) ==> (e2[e1/x]),  x must not be free in e1. U=This is quite expensive (O(n) for the size of the sub-tree). VV< tries to inline a stack of bindings, stopping when reaches  the end of the stack of lets.  6Output a list of all free variables in an expression. W+Show a human-readable version of a list of s. XLifted version of [. YLifted version of Z. Z=List all free variables (including types) in the expression. [JList all free identifiers (value-level free variables) in the expression. \cThe free variables in a case alternative, which excludes any identifiers bound in the alternative. ] A variant of \X that returns a function that accepts the case wild-card binder before giving a result. H This is so we can use this with congruence combinators, for example:  caseT id (const altFreeVarsT) $  _ wild _ fvs -> [ f wild | f <- fvs ]  from GHC documentation: De-shadowing the program is sometimes a useful pre-pass. P It can be done simply by running over the bindings with an empty substitution, I becuase substitution returns a result that has no-shadowing guaranteed. (Actually, within a single type) there might still be shadowing, because  0 is a no-op for the empty substitution, but that's probably OK.) ^-Determine whether an identifier is in scope. _@Lookup a rule and attempt to construct a corresponding rewrite. /Performs dependency anlaysis on an expression. l This can be useful to simplify a non-recursive recursive binding group to a non-recursive binding group. Lifted version of  .Try to figure out the arity of an identifier. #RS  TUV WXYZ[\]^_`RSTUVWXYZ[\]^_`R[ZXY\]STUV^`W_#RS  TUV WXYZ[\]^_`None aA handle for a specific version of the .   Currently as are identified by an ! label. bA b1 is a repository for complete Core syntax trees ().  For now, operations on a b are sequential, but later # it will be possible to have two es running in parallel. c Halt the b9 and return control to GHC, which compiles the specified a. d Halt the b" and abort GHC without compiling. eApply a  to the specified a& and return a handle to the resulting a. fApply a O to the a! and return the resulting value. g,Delete the internal record of the specified a. h List all the as tracked by the b. iIStart a HERMIT client by providing an IO function that takes the initial b and inital a handle.  The Modguts to  Modguts'/ function required by GHC Plugins is returned. * The callback is only ever called once. "#$%a b&cdefghi'( abcdefghiabcdefghicdefgh"#%$a b&cdefghi'(NonejA handle for an a$ combined with scoping information. l5An alternative HERMIT kernel, that provides scoping. x)The path within the current local scope. yKA primitive means of denoting navigation of a tree (within a local scope). zTop {Down |Up }Right ~Left ) An empty x. *&Convert between path representations. *Movement confined within the local scope. Add a y to the end of a x. IStart a HERMIT client by providing an IO function that takes the initial l and inital j handle.  The Modguts to  Modguts'/ function required by GHC Plugins is returned. !+jklmnopqrstuvwx,yz{|}~)*-./01jklmnopqrstuvwxyz{|}~y~}|{zxlmnopqrstuvwjk+jkl mnopqrstuvwx,y~}|{z)*-./01)None2:List all identifiers bound at the top-level in a program. 3/List all identifiers bound in a binding group. 4=Return the variable bound by a non-recursive let expression. 59List all identifiers bound in a recursive binding group. 67Return the identifier bound by a recursive definition. 72Return the variable bound by a lambda expression. 8.List the variables bound by a let expression. 98List the variables bound by a recursive let expression. :=Return the variable bound by a non-recursive let expression. ;]List all variables bound by a case expression (in the alternatives and the wildcard binder). <!Return the case wildcard binder. =CList the variables bound by all alternatives in a case expression. >0List the variables bound by a case alternative. ?Lifted version of 7. @hFind the unique variable bound in the context that matches the given name, failing if it is not unique. ALookup the name in the &" first, then, failing that, in GHC's global reader environment. B#Constructs a common error message.  Argument / should be the desired form of the expression. 23456789:;<=>?@ACB23456789:;<=>?@AB23456789:;<=>?@ACBNone+Stash a binding with a name for later use. ( Allows us to look at past definitions. +Stash a binding with a name for later use. ( Allows us to look at past definitions. * stashDef :: String -> TranslateH Core () ! stashDef label = contextfreeT $  core ->  case core of * DefCore def -> saveDef label def : BindCore (NonRec i e) -> saveDef label (Def i e)  _ -> fail stashDef: not a binding QApply a stashed definition (like inline, but looks in stash instead of context). DIConvert lhs of case alternative to a constructor application expression, C or a default expression in the case of the DEFAULT alternative. N Accepts a list of types to apply to the constructor before the value args.   data T a b = C a b Int  Pseudocode:  C alt2Exp (...) [a,b] (C, [x,y,z]) ==> C a b (x::a) (y::b) (z::Int) The EK denotes whether we picked the default (scrutinee) or built an expression. # This matters for the depth check. BGet the scrutinee instead of the patten match (for case binders). 0Only succeed if this variable is a case binder. DDNones for inlining variables. @If the current variable matches the given name, then inline it. Inline the current variable. tInline the current variable, using the scrutinee rather than the case alternative if it is a case wild-card binder. DIf the current variable is a case wild-card binder, then inline it. F;The implementation of inline, an important transformation. @ This *only* works on a Var of the given name. It can trivially $ be prompted to more general cases. GOEnsure all the free variables in an expression were bound above a given depth.  Assumes minimum depth is 0. CGet list of possible inline targets. Used by shell for completion. FEInline the scrutinee instead of the patten match (for case binders). /Only inline if this variable is a case binder. GFGNoneHICollect arguments to function we are folding, so we can unify with them. IHJK"vars that can unify with anything .alpha equivalences, wherever there is binding > note: we depend on behavior of lookup here, so new entries < should always be added to the front of the list so  we don'6t have to explicity remove them when shadowing occurs pattern we are matching on expression we are checking +mapping of vars to expressions, or failure IHJKNone!Externals for alpha-renaming. AList all visible identifiers (in the expression or the context). 4If a name is provided replace the string with that, . otherwise modify the string making sure to not# clash with any visible variables. A generalisation of  freshNameGeng that operates on any node, but only avoids name clashes with the results of the argument translation. LdInvent a new String based on the old one, but avoiding clashing with the given list of identifiers. MTRemove all variables from the first list that shadow a variable in the second list. NLifted version of M. 3 Additionally, it fails if no shadows are found. FRename local variables with manifestly unique names (x, x0, x1, ...). Q Does not rename top-level definitions (though this may change in the future). 1Replace all occurrences of a specified variable. U Arguments are the variable to replace and the replacement variable, respectively. O:Given a variable to replace, and a replacement, produce a  ->  function that  acts as in identity for all Bs except the one to replace, for which it returns the replacment.  Don't export this, it' ll likely just cause confusion. FAlpha rename a lambda binder. Optionally takes a suggested new name. DAlpha rename a case binder. Optionally takes a suggested new name. P_Rename the specified identifier in a case alternative. Optionally takes a suggested new name. 8Rename the specified identifiers in a case alternative. 4Rename all identifiers bound in a case alternative. 3Rename all identifiers bound in a case expression. QQAlpha rename a non-recursive let binder. Optionally takes a suggested new name. R~Alpha rename a non-recursive let binder if the variable appears in the argument list. Optionally takes a suggested new name. SbRename the specified identifier bound in a recursive let. Optionally takes a suggested new name. ;Rename the specified identifiers bound in a recursive let. /Rename the specified variables bound in a let. T1Rename all identifiers bound in a recursive let. URename the identifier bound in a recursive let with a single recursively bound identifier. Optionally takes a suggested new name. mRename the identifier bound in a let with a single bound identifier. Optionally takes a suggested new name. 'Rename all identifiers bound in a Let. VWAlpha rename a non-recursive top-level binder. Optionally takes a suggested new name. WoRename the specified identifier bound in a recursive top-level binder. Optionally takes a suggested new name. X_Rename the specified identifiers bound in a program node containing a recursive binding group. Y>Rename all identifiers bound in a recursive top-level binder. ZRename the identifier bound in a recursive top-level binder with a single recursively bound identifier. Optionally takes a suggested new name. zRename the identifier bound in a top-level binder with a single bound identifier. Optionally takes a suggested new name. 'Rename all identifiers bound in a Let. tAlpha rename any bindings at this node. Note: does not rename case alternatives unless invoked on the alternative. "LMNOPQRSTUVWXYZ["LMNOPQRSTUVWXYZ[None 'Externals relating to Let expressions. -e => (let v = e in v), name of v is provided Remove an unused let binding. 4 (let v = E1 in E2) => E2, if v is not free in E2 &let v = ev in e ==> case ev of v -> e *(let v = ev in e) x ==> let v = ev in e x *f (let v = ev in e) ==> let v = ev in f e Blet v = (let w = ew in ev) in e ==> let w = ew in let v = ev in e ( /v1 -> let v2 = e1 in e2) ==> let v2 = e1 in (  v1 -> e2)  Fails if v1 occurs in e1. - If v1 = v2 then v1 will be alpha-renamed. Gcase (let bnds in e) of wild alts ==> let bnds in (case e of wild alts) # Fails if any variables bound in bnds occurs in alts. 9Float a Let through an expression, whatever the context.  NonRec v (Let (NonRec w ew) ev)  p ==> NonRec w ew  NonRec v ev  p    None (Externals relating to Case expressions. N(case s of alt1 -> e1; alt2 -> e2) v ==> case s of alt1 -> e1 v; alt2 -> e2 v $f (case s of alt1 -> e1; alt2 -> e2) ==> $case s of alt1 -> f e1; alt2 -> f e2  Only safe if f is strict. Kcase (case s1 of alt11 -> e11; alt12 -> e12) of alt21 -> e21; alt22 -> e22  ==>  case s1 of 5 alt11 -> case e11 of alt21 -> e21; alt22 -> e22 5 alt12 -> case e12 of alt21 -> e21; alt22 -> e22 Jlet v = case ec of alt1 -> e1 in e ==> case ec of alt1 -> let v = e1 in e #Float a Case whatever the context. #Case-of-known-constructor rewrite. \FIf expression is a constructor application, return the relevant bits. ]We don'Lt want to use the recursive let here, so nest a bunch of non-recursive lets -Case split a free variable in an expression: *Assume expression e which mentions x :: [a] e ==> case x of x  [] -> e  (a:b) -> e FLike caseSplit, but additionally inlines the constructor applications + for each occurance of the named variable. > caseSplitInline nm = caseSplit nm >>> anybuR (inlineName nm) \]   \]None .Externals for local structural manipulations. - (Many taken from Chapter 3 of Andre Santos' dissertation.) NonRec v e ==> Rec [Def v e] ((\% v -> e1) e2) ==> (let v = e2 in e1) = This form of beta-reduction is safe if e2 is an arbitrary  expression (won't duplicate work). %Perform one or more beta-reductions. (let v = e1 in e2) ==> (\ v -> e2) e1 (\ v -> e1 v) ==> e1 e1 ==> (\ v -> e1 v) !Perform multiple eta-expansions. \Flatten all the top-level binding groups in the module to a single recursive binding group. pFlatten all the top-level binding groups in a program to a program containing a single recursive binding group. [Flatten all the top-level binding groups in a program to a single recursive binding group. )Abstract over a variable using a lambda.  e ==> ( x. e) x ^_  ^_None8Combine nested non-recursive lets into case of a tuple. (cleanupUnfold cleans a unfold operation / (for example, an inline or rule application) + It is used at the level of the top-redex. 2Push a function through a Case or Let expression. ) Unsafe if the function is not strict.    Nonef = e ==> f = fix ( f -> e)    NoneA  is a collection of s.  Looking up a  (via a / key) returns a list, as there can be multiple s with the same name. Augment a list of s by adding all of HERMIT' s primitive -s, plus any GHC RULES pragmas in the module. #Create a dictionary from a list of s. "The pretty-printing dictionaries. `abcduniverse of commands to search tag matching predicate &means to combine the matched rewrites euniverse of commands to search tag matching predicate help text preamble  `abcdeNoneGiven a list of fs, produce the  to & function required to build a plugin. CBuild a hermit plugin. This mainly handles the per-module options. g=Determine whether to act on this module, choose plugin pass. hLFilter options to those pertaining to this module, stripping module prefix. ijklghmnijklghmnNoneothe current AST pwhich pretty printer to use q#The options for the pretty printer r#the way of outputing to the screen show wide is the screen? t!keyboard input the the nav panel uif loading a file vThe list of ticked messages wDAstEffects are things that are recorded in our log and saved files. x Adding a tag 8 | A precondition or other predicate that must not fail y3This changes the currect location using directions z8This changes the current location using a computed path {;This applys a rewrite (giving a whole new lower-level AST) /The first argument is a list of files to load. b|}~opqrstuvwxyz{4|}~ opqrstuvw{zyxNone*+,*+-*+./01123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghiijklmnopqrstuvwxyz{|}~&                                     ! " # $ % % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P N Q R S J K L T U V W X Y Z [ \ M J K L MM]^_`abcdefghijklmnopqrstuvwwxxyz{|}~!"""""" " " "    "" *!"#$%&&'Q()*h+,-./012345567789:;<=>?@ABCDEFGHIJKLMNOP*!Q*!R*!S*!T*!U*!V*!W*!X*!Y*!Z*![*!\*!]*!^*!_*!`*!a*!b*!c*!d*!e*!f*!g*!h*!i*!j*!k*!l*!m*!n*!o*!p*!q*!r*!s*!t*!u*!v*!w*!x*!y*!z*!{*!|*!}*!~*!*!*!*!*!*!*!*!*************************************************************************************          5                        !"#$%&'()*+,-.n/012345o6789:;<=>?)@)A)B)C)D)E)F)G)H)I)J)K)L)M)N)O)P)QRSTUVWXYZ[\]^_`abcdefghijklmnopqrst)uvwxxyz{|}~hermit-0.1.4.0Language.HERMIT.KureLanguage.HERMIT.ExprLanguage.HERMIT.CoreLanguage.HERMIT.ContextLanguage.HERMIT.MonadLanguage.HERMIT.ExternalLanguage.HERMIT.InterpLanguage.HERMIT.Primitive.Kure$Language.HERMIT.Primitive.NavigationLanguage.HERMIT.PrettyPrinter!Language.HERMIT.PrettyPrinter.AST#Language.HERMIT.PrettyPrinter.Clean!Language.HERMIT.PrettyPrinter.GHC"Language.HERMIT.PrettyPrinter.JSONLanguage.HERMIT.Primitive.DebugLanguage.HERMIT.Primitive.GHCLanguage.HERMIT.KernelLanguage.HERMIT.Kernel.Scoped Language.HERMIT.Primitive.Unfold Language.HERMIT.Primitive.InlineLanguage.HERMIT.Primitive.Fold)Language.HERMIT.Primitive.AlphaConversion#Language.HERMIT.Primitive.Local.Let$Language.HERMIT.Primitive.Local.CaseLanguage.HERMIT.Primitive.LocalLanguage.HERMIT.Primitive.New"Language.HERMIT.Primitive.FixPointLanguage.HERMIT.DictionaryLanguage.HERMIT.PluginLanguage.HERMIT.Shell.CommandHERMITLanguage.HERMIT DictionaryLanguage.HERMIT.GHCLanguage.HERMIT.DicitonarybashLanguageKUREDataMap Language.HERMIT.Primitive.Common kure-2.4.10Language.KURE.Utilities fromKureMrunKureMKureMStmtHScopeHExprHAppHCmdNameSrcName numStmtsH unparseExprH unparseStmtH unparseStmtsH parseExprH parseStmtsH CoreTickishCoreDefDefCoreProgProgConsProgNilCoreAltCoreExprCoreDefCoreBindCoreProgCore ModGutsCore progToBinds bindsToProg bindToIdExprs defToIdExpr defsToRecBindisTypetypeExprToTypeexprTypeOrKindappCountHermitChermitBindings hermitDepth hermitPath hermitModGuts HermitBindingCASELAMBINDhermitBindingDepth initHermitC@@ addBindingaddCaseBindingaddLambdaBindingaddAltBindingslookupHermitBinding boundVarsboundIn findBoundVars DebugMessage DebugCore DebugTickHermitM HermitMEnv hs_debugChanDefStashLabelgetStashsendDebugMessagesaveDef lookupDefrunHM liftCoreMnewIdH newTyVarH cloneVarH mkHermitMEnvLensHRewriteH TranslateHidRmodGutsTmodGutsRprogNilT progConsT progConsAllR progConsAnyR progConsOneRnonRecTnonRecRrecTrecAllRrecAnyRrecOneRdefTdefRaltTaltRvarTlitTappTappAllRappAnyRappOneRlamTlamRletTletAllRletAnyRletOneRcaseTcaseAllRcaseAnyRcaseOneRcastTcastRtickTtickRtypeT coercionTrecDefT recDefAllR recDefAnyR recDefOneR consNonRecTconsNonRecAllRconsNonRecAnyRconsNonRecOneRconsRecT consRecAllR consRecAnyR consRecOneR consRecDefTconsRecDefAllRconsRecDefAnyRconsRecDefOneR letNonRecT letNonRecAllR letNonRecAnyR letNonRecOneRletRecT letRecAllR letRecAnyR letRecOneR letRecDefT letRecDefAllR letRecDefAnyR letRecDefOneRcaseAltT caseAltAllR caseAltAnyR caseAltOneRpromoteModGutsR promoteProgR promoteBindR promoteDefR promoteAltR promoteExprRpromoteModGutsT promoteProgT promoteBindT promoteDefT promoteAltT promoteExprT StringBoxTranslateCorePathBoxNameBoxTranslateCoreCheckBoxTranslateCoreStringBoxRewriteCoreBoxIntBoxTagBoxExternBoxboxunboxExternal externName externFun externHelp externTagsTag.+remTagtagMatchTagECmdTag Experiment UnimplementedTODOContextBashVersionControlDebug PreConditionCommute Introduce PredicateQuery NavigationShallowDeepLoopEvalShell ExternalHelp ExternalNamedictionaryOfTags.&.||notTexternal toDictionarytoHelpInterp interpExprHinterp externalsbindingGroupOf considerNamerhsOf bindGroup namedBindingconsiderTargets considerables DebugPretty PrettyState prettyPath prettyColor RenderCoderStartrEnd rDoHighlightrPutStrHTMLLaTeXUnicodeASCII RenderSpecial renderSpecial SpecialSymbol ForallSymbolTypeBindSymbol TypeSymbolRightArrowSymbol TypeOfSymbol LambdaSymbol ShowOptionOmitAbstractShow PrettyOptionspo_fullyQualified po_exprTypespo_typesForBinders po_highlightpo_depthpo_notes po_ribbonpo_widthPrettyHSyntaxForColorLitColor TypeColorVarColor SyntaxColor KeywordColorAttr SpecialFontColorPathAttr HermitMarkPopAttrPushAttrDocHattrattrPvarColor keywordColor markColor specialFontrenderSpecialFontspecialFontMap renderCodeghcCorePrettyH coreRenders latexVerbatim latexToStringlistifyvlisthlist corePrettyHRetExprRetEmptyRetAtomRetAppRetLetRetLamisAtom specialSymbolsymbolkeywordppParensatomExpr normalExpr typeSymboltypeBindSymbolobserveFailureRobserveRtraceRsubstR letSubstR safeLetSubstRsafeLetSubstPlusRshowVarsfreeIdsT freeVarsTcoreExprFreeVarscoreExprFreeIds altFreeVarsTaltFreeVarsExclWildTinScoperules exprEqualASTKernelresumeKabortKapplyKqueryKdeleteKlistK hermitKernelSAST ScopedKernelresumeSabortSapplySquerySdeleteSlistSpathSmodPathS beginScopeS endScopeS LocalPath DirectionTDURL moveLocallyextendLocalPath scopedKernelstashDef stashApply getUnfolding inlineNameinlineinlineScrutineeinlineCaseBinder inlineTargets stashFoldRfoldR visibleVarsT freshNameGenTfreshNameGenAvoidingunshadow replaceVarRalphaLamalphaCaseBinder alphaAltIdsalphaAlt alphaCasealphaLetRecIds alphaLetVars alphaLetOnealphaLet alphaConsOne alphaConsalpha letExternalsletIntroletElim letToCase letFloatApp letFloatArg letFloatLet letFloatLam letFloatCase letFloatExprletFloatLetTop caseExternals caseFloatApp caseFloatArg caseFloatCase caseFloatLet caseFloat caseReduce caseSplitcaseSplitInline nonrecToRec betaReducebetaReducePlus betaExpand etaReduce etaExpandmultiEtaExpand flattenModuleflattenProgramRflattenProgramTabstractisVar simplifyR collectLets letTupleR testQuery cleanupUnfoldunfold withUnfoldpush fixLocation findFixId guardIsFixIdfixIntrofixSpecializationfixSpecialization'workerWrapperFacTestworkerWrapperSplitTestmonomorphicWorkerWrapperFacmonomorphicWorkerWrapperSplit all_externals dictionary pp_dictionary HermitPass hermitPlugin commandLinepluginbaseGHC.BaseStringnumStmtH InfixableExpr unparseAtomparsemanysomebind parseExprsH'parseTopExprH1 parseExprH0 parseExprH1mkAppHmkAppH'item parseTokenisId isInfixId ghc-7.6.1CoreSynTickishVarIdCoreExprCoreBindTypeRepType CoreUtilsexprTypeKind var2String name2THNameNametemplate-haskellLanguage.Haskell.TH.Syntax var2THNameunqualifiedVarNamecmpTHName2NamecmpString2Name cmpTHName2Var cmpString2VarfindNameFromTHOccNameOccEnvppIdInfoshowAttributesTyVarTyAppTyTyConAppFunTyForAllTyLitTy CoreArity exprArityConvertthRdrNameGuessesTysPrim alphaTyVarsPanicthrowGhcException ProgramError GhcExceptionLanguage.KURE.Walker AbsolutePathHscTypesModGutsAltConDataCon$fPathContextHermitCputStash CoreMonadCoreM runHermitMnewName$fHasDynFlagsHermitM$fMonadThingsHermitM$fMonadUniqueHermitM$fMonadIOHermitM$fMonadCatchHermitM$fMonadHermitM$fApplicativeHermitM$fFunctorHermitMLiteralCoreAltCoercion progConsT'recT'appT'letT'caseT'$fWalkerHermitCHermitMExpr $fNodeExpr$fInjectionExprCore$fWalkerHermitCHermitM(,,) $fNode(,,)$fInjection(,,)Core$fWalkerHermitCHermitMCoreDef $fNodeCoreDef$fInjectionCoreDefCore$fWalkerHermitCHermitMBind $fNodeBind$fInjectionBindCore$fWalkerHermitCHermitMCoreProg$fNodeCoreProg$fInjectionCoreProgCore$fWalkerHermitCHermitMModGuts $fNodeModGuts$fInjectionModGutsCore$fWalkerHermitCHermitMCore $fNodeCore testPathTpathTpathRrootL repeatPathL exhaustPathLpathLuniquePrunePathToT uniquePathToT prunePathsToToneNonEmptyPathToT onePathToTpathsToTrootPathabsPathT extendAbsPath rootAbsPath innermostRprunetdRonebuRonetdRanyduRanybuRanytdRallduRallbuRalltdR collectPruneTcollectTcrushbuTcrushtdTprunetdTonebuTonetdTfoldbuTfoldtdTchildRchildT hasChildThasChild numChildrenT numChildrenGenericNodeoneRanyRallRoneTallTchildLWalker contextPath PathContextPathLanguage.KURE.InjectionretractLinjectLpromoteRpromoteWithFailMsgRextractRextractWithFailMsgRpromoteTpromoteWithFailMsgTextractTretractTinjectTretractMinjectMretractinject InjectionLanguage.KURE.TranslatepureLbidirectionalL testLensTfocusTfocusRlensinvert whicheverR bidirectional sideEffectRmapTexposeTcontextTconstT contextonlyT contextfreeTrewrite translateapply TranslateRewrite backwardT forewardT BiTranslate BiRewritelensTLensLanguage.KURE.Combinatorsconstant forkSecond forkFirstforkswaptoSndtoFstargumentresultcatchesTandRorR>+>repeatRchangedRattemptRtryR accepterRacceptRreaderT<+unlessMwhenMifMguardMguardMsgwithPatFailMsg prefixFailMsg setFailMsg modFailMsgnotMtestMattemptMmtryMtryMcatchesM<<+catchM MonadCatchcatchTfailT CategoryCatchData.Typeable.InternalTypeable Data.DynamicDynamictoTagEOrTagAndTagNotTag $fExtern[]$fExternTranslate $fExternName$fExternTranslate0$fExternTranslate1$fExternTranslate2 $fExternInt $fExternTagE $fExtern(->) $fTagCmdTag $fTagTagE runInterp interpExpr interpExpr' dynAppMsg$fFunctorInterphfocusRhfocusT ConsiderableCoerceTypeVarTickyCastyCaseOfLetInLambda ApplicationVariableCaseAlt DefinitionBindingrecognizedConsiderablesconsiderConstructstring2considerableunderConsideration$fRenderCodeHTML$fRenderCodeDebugPretty$fMonoidDebugPretty$fRenderSpecialDebugPretty$fRenderCodeASCII$fRenderCodeLaTeX$fRenderSpecialHTML $fMonoidHTML$fRenderSpecialLaTeX $fMonoidLaTeX$fRenderSpecialUnicode$fRenderSpecialASCII $fMonoidASCII$fRenderSpecialChar$fDefaultPrettyOptions substExprR substTopBindR freeIdsQuery deShadowProgR CoreSubstsubstTyoccurAnalyseExproccurAnalyseExprRarityOfinfoshowExprTypeOrKindcoreNodecoreConstructorrulesToRewriteHgetHermitRules rules_helpmakeRuleaddCoreBindAsRule bindEqual coreEqual compareValuescastEliminationghc-prim GHC.TypesInt KernelStateMsgDoneReqfindWithErrMsgfindemptyLocalPathlocalPath2Path SASTStorelocalPaths2PathspathStackToLensget safeTakeTMVar$fShowLocalPath progVarsT bindVarsT nonRecVarTrecVarsTdefVarTlamVarTletVarsT letRecVarsT letNonRecVarT caseVarsT caseWildVarT caseAltVarsTaltVarsT boundVarsT findBoundVarTfindIdT wrongExprFormfindIdMGalt2Exp Data.EitherEitherconfigurableInline ensureDepthfoldArgsfoldaddAlpha foldMatch inventNames shadowedBy shadowedByT replaceVar alphaAltIdalphaLetNonRecalphaLetNonRecVars alphaLetRecId alphaLetRecalphaLetRecOnealphaConsNonRecalphaConsRecIdalphaConsRecIds alphaConsRecalphaConsRecOnewrongFormForAlpha isDataCon nestedLetsmultiBetaReducenodupsprim_externals make_help help_command layoutTxtmetaCmdmetaHelpCommandLineOption modFilter filterOptsOptionspassinsertAt$fDefaultOptions cl_cursor cl_prettycl_pretty_opts cl_rendercl_widthcl_nav cl_loadingcl_tick AstEffect PathfinderApplyUnicodeTerminalCompletionType AmbiguousCCommandCInlineC ConsiderC SessionStateCommandLineStatecl_graphcl_tagscl_dict cl_kernel cl_sessionCLMShellCommandBoxGotoTagGotoStepBack MetaCommandSaveFileLoadFileDumpAbortResumeQueryFunInquiryMessageDisplayQueryT ShellEffectSessionStateEffectCorrectnessCriteraEndScope BeginScope ShellCommandinterpShellCommandshell_externals showRendererschangeRenderercatchpretty showFocus iokm2clm'iokm2clmnewSASTcompletionTypecompletionQuery shellCompleteloopourCatch evalStmtsevalExprperformAstEffectperformShellEffect performQueryperformMetaCommandputStrToConsole finalRendersunicodeConsole navigation getNavCmdshowDerivationTreeshowRefactorTrail showGraph cl_kernel_envtick$fRenderCodeUnicodeTerminal$fMonoidUnicodeTerminal$fRenderSpecialUnicodeTerminal$fExternShellCommand$fExternShellEffect$fExternMetaCommand$fExternQueryFun$fExternAstEffect interactive