// Package "explanation" provides an observer to gather the reasoning during the // reduction, and present a thorough explanation to the user for each step. package plugins import ( "fmt" "git.maximhutz.com/max/lambda/pkg/interpreter" ) // Track the reductions made by a reduction process. type Explanation struct { reducer interpreter.Interpreter } // Attaches a new explanation tracker to a reducer. func NewExplanation(r interpreter.Interpreter) *Explanation { plugin := &Explanation{reducer: r} r.On(interpreter.StartEvent, plugin.Start) r.On(interpreter.StepEvent, plugin.Step) return plugin } func (t *Explanation) Start() { fmt.Println(t.reducer.Expression().String()) } func (t *Explanation) Step() { fmt.Println(" =", t.reducer.Expression().String()) }