<commit_before>package main

// Grammar of the language used in the evaluator
//
// Expr     = SetExpr
//          | MapExpr
//          | CMapExpr
//          | CmdExpr
//          | CallExpr
//          | ExecExpr
//          | ListExpr
//
// SetExpr  = 'set' <opt> <val> ';'
//
// MapExpr  = 'map' <keys> Expr ';'
//
// CMapExpr = 'cmap' <key> <cmd> ';'
//
// CmdExpr  = 'cmd' <name> Expr ';'
//
// CallExpr = <name> <args> ';'
//
// ExecExpr = Prefix      <expr>      '\n'
//          | Prefix '{{' <expr> '}}' ';'
//
// Prefix   = '$' | '!' | '&' | '/' | '?'
//
// ListExpr = ':'      ListRest      '\n'
//          | ':' '{{' ListRest '}}' ';'
//
// ListRest = Nil
//          | Expr ListRest

import (
	"bytes"
	"fmt"
	"io"
	"strings"
)

type expr interface {
	String() string

	eval(app *app, args []string)
	// TODO: add a bind method to avoid passing args in eval
}

type setExpr struct {
	opt string
	val string
}

func (e *setExpr) String() string { return fmt.Sprintf("set %s %s", e.opt, e.val) }

type mapExpr struct {
	keys string
	expr expr
}

func (e *mapExpr) String() string { return fmt.Sprintf("map %s %s", e.keys, e.expr) }

type cmapExpr struct {
	key string
	cmd string
}

func (e *cmapExpr) String() string { return fmt.Sprintf("cmap %s %s", e.key, e.cmd) }

type cmdExpr struct {
	name string
	expr expr
}

func (e *cmdExpr) String() string { return fmt.Sprintf("cmd %s %s", e.name, e.expr) }

type callExpr struct {
	name string
	args []string
}

func (e *callExpr) String() string { return fmt.Sprintf("%s -- %s", e.name, e.args) }

type execExpr struct {
	pref string
	expr string
}

func (e *execExpr) String() string {
	var buf bytes.Buffer

	buf.WriteString(e.pref)
	buf.WriteString("{{ ")

	lines := strings.Split(e.expr, "\n")

	for _, line := range lines {
		trimmed := strings.TrimSpace(line)
		if trimmed == "" {
			continue
		}

		buf.WriteString(trimmed)

		if len(lines) > 1 {
			buf.WriteString(" ...")
		}

		break
	}

	buf.WriteString(" }}")

	return buf.String()
}

type listExpr struct {
	exprs []expr
}

func (e *listExpr) String() string {
	buf := []byte{':', '{', '{', ' '}
	for _, expr := range e.exprs {
		buf = append(buf, expr.String()...)
		buf = append(buf, ';', ' ')
	}
	buf = append(buf, '}', '}')
	return string(buf)
}

type parser struct {
	scanner *scanner
	expr    expr
	err     error
}<commit_msg>cleanup<commit_after>package main

// Grammar of the language used in the evaluator
//
// Expr     = SetExpr
//          | MapExpr
//          | CMapExpr
//          | CmdExpr
//          | CallExpr
//          | ExecExpr
//          | ListExpr
//
// SetExpr  = 'set' <opt> <val> ';'
//
// MapExpr  = 'map' <keys> Expr ';'
//
// CMapExpr = 'cmap' <key> <cmd> ';'
//
// CmdExpr  = 'cmd' <name> Expr ';'
//
// CallExpr = <name> <args> ';'
//
// ExecExpr = Prefix      <expr>      '\n'
//          | Prefix '{{' <expr> '}}' ';'
//
// Prefix   = '$' | '!' | '&' | '/' | '?'
//
// ListExpr = ':'      ListRest      '\n'
//          | ':' '{{' ListRest '}}' ';'
//
// ListRest = Nil
//          | Expr ListRest

import (
	"bytes"
	"fmt"
	"io"
	"strings"
)

type expr interface {
	String() string

	eval(app *app, args []string)
	// TODO: add a bind method to avoid passing args in eval
}

type setExpr struct {
	opt string
	val string
}

func (e *setExpr) String() string { return fmt.Sprintf("set %s %s", e.opt, e.val) }

type mapExpr struct {
	keys string
	expr expr
}

func (e *mapExpr) String() string { return fmt.Sprintf("map %s %s", e.keys, e.expr) }

type cmapExpr struct {
	key string
	cmd string
}

func (e *cmapExpr) String() string { return fmt.Sprintf("cmap %s %s", e.key, e.cmd) }

type cmdExpr struct {
	name string
	expr expr
}

func (e *cmdExpr) String() string { return fmt.Sprintf("cmd %s %s", e.name, e.expr) }

type callExpr struct {
	name string
	args []string
}

func (e *callExpr) String() string { return fmt.Sprintf("%s -- %s", e.name, e.args) }

type execExpr struct {
	pref string
	expr string
}

func (e *execExpr) String() string {
	var buf bytes.Buffer

	buf.WriteString(e.pref)
	buf.WriteString("{{ ")

	lines := strings.Split(e.expr, "\n")

	for _, line := range lines {
		trimmed := strings.TrimSpace(line)
		if trimmed == "" {
			continue
		}

		buf.WriteString(trimmed)

		if len(lines) > 1 {
			buf.WriteString(" ...")
		}

		break
	}

	buf.WriteString(" }}")

	return buf.String()
}

type listExpr struct {
	exprs []expr
}

func (e *listExpr) String() string {
	var buf bytes.Buffer

	buf.WriteString(":{{ ")

	for _, expr := range e.exprs {
		buf.WriteString(expr.String())
		buf.WriteString("; ")
	}

	buf.WriteString("}}")

	return buf.String()
}

type parser struct {
	scanner *scanner
	expr    expr
	err     error
}
{'fraction_non_alphanumeric': 0.18683651804670912, 'fraction_numerical': 0.0004246284501061571, 'mean_word_length': 2.458883994126285, 'pattern_counts': {'":': 1, '<': 23, '<?xml version=': 0, '>': 25, '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': '992866', 'n_tokens_mistral': 1828, 'n_tokens_neox': 1762, 'n_words': 474}