package normalorder import ( "git.maximhutz.com/max/lambda/pkg/emitter" "git.maximhutz.com/max/lambda/pkg/lambda" "git.maximhutz.com/max/lambda/pkg/repr" "git.maximhutz.com/max/lambda/pkg/runtime" ) // NormalOrderReducer implements normal order (leftmost-outermost) reduction // for lambda calculus expressions. type Runtime struct { emitter.BaseEmitter[runtime.Event] expression lambda.Expression } // NewNormalOrderReducer creates a new normal order reducer. func NewRuntime(expression lambda.Expression) *Runtime { return &Runtime{ BaseEmitter: *emitter.New[runtime.Event](), expression: expression, } } // Expression returns the current expression state. func (r *Runtime) Expression() repr.Repr { return r.expression } func (r *Runtime) Step() bool { result, done := ReduceOnce(r.expression) r.expression = result return !done } // Reduce performs normal order reduction on a lambda expression. // The expression must be a lambda.Expression; other types are returned unchanged. func (r *Runtime) Run() { r.Emit(runtime.StartEvent) for !r.Step() { r.Emit(runtime.StepEvent) } r.Emit(runtime.StopEvent) }