// Package "engine" provides an extensible interface for users to interact with // λ-calculus and other expression evaluation modes. package engine import ( "git.maximhutz.com/max/lambda/internal/config" "git.maximhutz.com/max/lambda/pkg/emitter" "git.maximhutz.com/max/lambda/pkg/expr" "git.maximhutz.com/max/lambda/pkg/reducer" ) // Engine is a process for reducing one expression. type Engine struct { Config *config.Config Expression expr.Expression Reducer reducer.Reducer emitter.BaseEmitter[Event] } // New creates a new engine with the given expression and reducer. func New(config *config.Config, expression expr.Expression, reducer reducer.Reducer) *Engine { return &Engine{ Config: config, Expression: expression, Reducer: reducer, BaseEmitter: *emitter.New[Event](), } } // Run begins the reduction process. func (e *Engine) Run() { e.Emit(StartEvent) e.Expression = e.Reducer.Reduce(e.Expression, func(reduced expr.Expression) { e.Expression = reduced e.Emit(StepEvent) }) e.Emit(StopEvent) }