diff options
| author | Paul Buetow <paul@buetow.org> | 2026-05-24 18:20:13 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-05-24 18:20:13 +0300 |
| commit | 99bd810848bcff13c96a1e979b2a0c28375a2748 (patch) | |
| tree | 038c5a697f31940866a6397f51eceec9a296c678 | |
| parent | 7a3bd4f966f7262dd4e242057679826392800817 (diff) | |
fix(rpn): narrow OperatorProvider with focused registration interfaces (task 3k)
| -rw-r--r-- | internal/rpn/operations_interfaces.go | 30 | ||||
| -rw-r--r-- | internal/rpn/operator_registry.go | 12 |
2 files changed, 36 insertions, 6 deletions
diff --git a/internal/rpn/operations_interfaces.go b/internal/rpn/operations_interfaces.go index 3016f28..784ac76 100644 --- a/internal/rpn/operations_interfaces.go +++ b/internal/rpn/operations_interfaces.go @@ -116,6 +116,36 @@ type OperatorProvider interface { HyperOperator } +// Registration interfaces — focused composites for each operator group. +// Adding a new operator category only requires creating a new registration +// interface and helper, without editing OperatorProvider or existing helpers. +type ( + // ArithmeticOpProvider covers standard arithmetic, fast power, and log operators. + ArithmeticOpProvider interface { + ArithmeticOperator + PowerIntOperator + LogarithmicOperator + } + // ComparisonOpProvider covers boolean comparison operators. + ComparisonOpProvider interface { + BooleanOperator + } + // VariableOpProvider covers variable assignment and metric conversion. + VariableOpProvider interface { + AssignRight(*Stack) error + AssignLeft(*Stack) error + Convert(*Stack) error + } + // CommandOpProvider covers command operators that return immediate results. + CommandOpProvider interface { + Show(*Stack) (string, error) + ListVariables() (string, error) + ListConstants() (string, error) + ClearVariables() + ClearConstants() + } +) + // OperationsProvider combines all interfaces that RPN needs from Operations. // RPN depends on this interface (DIP) rather than the concrete *Operations type. type OperationsProvider interface { diff --git a/internal/rpn/operator_registry.go b/internal/rpn/operator_registry.go index 80f5b05..8a062ca 100644 --- a/internal/rpn/operator_registry.go +++ b/internal/rpn/operator_registry.go @@ -34,7 +34,7 @@ func NewOperatorRegistry(op OperatorProvider) *OperatorRegistry { } // registerArithmeticOperators registers math and numeric operators. -func (r *OperatorRegistry) registerArithmeticOperators(op OperatorProvider) { +func (r *OperatorRegistry) registerArithmeticOperators(op ArithmeticOpProvider) { r.registerStandardOperator("+", func(stack *Stack) error { return op.Add(stack) }) r.registerStandardOperator("-", func(stack *Stack) error { return op.Subtract(stack) }) r.registerStandardOperator("*", func(stack *Stack) error { return op.Multiply(stack) }) @@ -48,7 +48,7 @@ func (r *OperatorRegistry) registerArithmeticOperators(op OperatorProvider) { } // registerComparisonOperators registers equality and ordering operators. -func (r *OperatorRegistry) registerComparisonOperators(op OperatorProvider) { +func (r *OperatorRegistry) registerComparisonOperators(op ComparisonOpProvider) { r.registerStandardOperator("gt", func(stack *Stack) error { return op.GT(stack) }) r.registerStandardOperator("lt", func(stack *Stack) error { return op.LT(stack) }) r.registerStandardOperator("<", func(stack *Stack) error { return op.LT(stack) }) @@ -64,7 +64,7 @@ func (r *OperatorRegistry) registerComparisonOperators(op OperatorProvider) { } // registerStackOperators registers stack manipulation operators. -func (r *OperatorRegistry) registerStackOperators(op OperatorProvider) { +func (r *OperatorRegistry) registerStackOperators(op StackOperator) { r.registerStandardOperator("dup", func(stack *Stack) error { return op.Dup(stack) }) r.registerStandardOperator("swap", func(stack *Stack) error { return op.Swap(stack) }) r.registerStandardOperator("pop", func(stack *Stack) error { return op.Pop(stack) }) @@ -72,14 +72,14 @@ func (r *OperatorRegistry) registerStackOperators(op OperatorProvider) { } // registerVariableOperators registers assignment and conversion operators. -func (r *OperatorRegistry) registerVariableOperators(op OperatorProvider) { +func (r *OperatorRegistry) registerVariableOperators(op VariableOpProvider) { r.registerStandardOperator(":=", func(stack *Stack) error { return op.AssignRight(stack) }) r.registerStandardOperator("=:", func(stack *Stack) error { return op.AssignLeft(stack) }) r.registerStandardOperator("convert", func(stack *Stack) error { return op.Convert(stack) }) } // registerCommandOperators registers operators that return a result immediately. -func (r *OperatorRegistry) registerCommandOperators(op OperatorProvider) { +func (r *OperatorRegistry) registerCommandOperators(op CommandOpProvider) { r.registerCommandOperator("show", func(stack *Stack) (string, error) { return op.Show(stack) }) r.registerCommandOperator("showstack", func(stack *Stack) (string, error) { return op.Show(stack) }) r.registerCommandOperator("print", func(stack *Stack) (string, error) { return op.Show(stack) }) @@ -90,7 +90,7 @@ func (r *OperatorRegistry) registerCommandOperators(op OperatorProvider) { } // registerHyperOperators registers hyper (vectorized) operators. -func (r *OperatorRegistry) registerHyperOperators(op OperatorProvider) { +func (r *OperatorRegistry) registerHyperOperators(op HyperOperator) { r.registerHyperOperator("[+]", func(stack *Stack) error { return op.HyperAdd(stack) }) r.registerHyperOperator("[-]", func(stack *Stack) error { return op.HyperSubtract(stack) }) r.registerHyperOperator("[*]", func(stack *Stack) error { return op.HyperMultiply(stack) }) |
