<commit_before>"""An AST editor.
   There is one method per AST node; override the methods for which you need to change the AST,
   and leave the others untouched.
   
   The default operation for “bottom“ node types’ methods is to copy the node, editing the children.
   (The default operation for non-“bottom” node types’ methods is inherited from [[NarrowingTransformer]],
   see there.)
   By itself, an [[Editor]] will not actually edit the AST –
   it’s only scaffolding that allows you to easily edit parts of the AST without having to bother with
   the deep nesting of the nodes.
   
   For example:
   ~~~
   class TraceFunctionEditor() satisfies Editor {
       shared actual FunctionDefinition transformFunctionDefinition(FunctionDefinition that) {
           value print = BaseExpression(MemberNameWithTypeArguments(LIdentifier("print")));
           value enterArgs = PositionalArguments(ArgumentList([StringLiteral("enter ``that.name.name``")]));
           value leaveArgs = PositionalArguments(ArgumentList([StringLiteral("leave ``that.name.name``")]));
           value enter = InvocationStatement(Invocation(print.copy(), enterArgs));
           value leave = InvocationStatement(Invocation(print.copy(), leaveArgs));
           return that.copy {
               definition = Block(concatenate([enter], that.definition.content, [leave]));
           };
       }<commit_msg>Fix satisfied interface in Editor documentation<commit_after>"""An AST editor.
   There is one method per AST node; override the methods for which you need to change the AST,
   and leave the others untouched.
   
   The default operation for “bottom“ node types’ methods is to copy the node, editing the children.
   (The default operation for non-“bottom” node types’ methods is inherited from [[ImmediateNarrowingTransformer]],
   see there.)
   By itself, an [[Editor]] will not actually edit the AST –
   it’s only scaffolding that allows you to easily edit parts of the AST without having to bother with
   the deep nesting of the nodes.
   
   For example:
   ~~~
   class TraceFunctionEditor() satisfies Editor {
       shared actual FunctionDefinition transformFunctionDefinition(FunctionDefinition that) {
           value print = BaseExpression(MemberNameWithTypeArguments(LIdentifier("print")));
           value enterArgs = PositionalArguments(ArgumentList([StringLiteral("enter ``that.name.name``")]));
           value leaveArgs = PositionalArguments(ArgumentList([StringLiteral("leave ``that.name.name``")]));
           value enter = InvocationStatement(Invocation(print.copy(), enterArgs));
           value leave = InvocationStatement(Invocation(print.copy(), leaveArgs));
           return that.copy {
               definition = Block(concatenate([enter], that.definition.content, [leave]));
           };
       }
{'fraction_non_alphanumeric': 0.0919702865228157, 'fraction_numerical': 0.0, 'mean_word_length': 3.6666666666666665, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3294824', 'n_tokens_mistral': 678, 'n_tokens_neox': 658, 'n_words': 259}