Move the event emitter and lifecycle events from the engine into the reducer, making the reducer the single point of orchestration for reduction. This eliminates the engine package entirely. - Add events.go to pkg/reducer with Start, Step, and Stop events. - Extend Reducer interface to embed Emitter and add Expression() method. - Update NormalOrderReducer to embed BaseEmitter and emit lifecycle events. - Update all plugins to attach to Reducer instead of Engine. - Remove internal/engine package. - Add Off() method to BaseEmitter to complete Emitter interface. - Fix Emitter.On signature to use generic type E instead of string.
28 lines
947 B
Go
28 lines
947 B
Go
// Package reducer provides the abstract Reducer interface for all expression
|
|
// reduction strategies.
|
|
package reducer
|
|
|
|
import (
|
|
"git.maximhutz.com/max/lambda/pkg/emitter"
|
|
"git.maximhutz.com/max/lambda/pkg/expr"
|
|
)
|
|
|
|
// Reducer defines the interface for expression reduction strategies.
|
|
// Different evaluation modes (normal order, applicative order, SKI combinators,
|
|
// etc.) implement this interface with their own reduction logic.
|
|
//
|
|
// Reducers also implement the Emitter interface to allow plugins to observe
|
|
// reduction lifecycle events (Start, Step, Stop).
|
|
type Reducer interface {
|
|
emitter.Emitter[Event]
|
|
|
|
// Reduce performs all reduction steps on the expression.
|
|
// Emits StartEvent before reduction, StepEvent after each step, and
|
|
// StopEvent after completion.
|
|
// Returns the final reduced expression.
|
|
Reduce(e expr.Expression) expr.Expression
|
|
|
|
// Expression returns the current expression state.
|
|
Expression() expr.Expression
|
|
}
|