diff options
| author | Paul Buetow <paul@buetow.org> | 2026-05-24 14:05:35 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-05-24 14:05:35 +0300 |
| commit | 7c9f67ff1e149dc28afe59d14bbc59d7695422ad (patch) | |
| tree | 701070708fcd2a15d67d09d0cdcae0c32d929a52 | |
| parent | be23ab5bd3ac953a0de50aeef6569ee783982d81 (diff) | |
refactor(rpn): split ConstantsProvider into Reader/Writer/Admin sub-interfaces (#wj)
Follows the same ISP-compliant pattern as VariableStore (VariableReader,
VariableWriter, VariablePersistence). The fat 7-method ConstantsProvider
is now split into:
- ConstantsReader: GetConstant, ListConstants, Count, HasConstant
- ConstantsWriter: SetConstant
- ConstantsAdmin: ClearConstants, ReloadBuiltInConstants
- ConstantsProvider: embeds all three for convenience
RPN.consts narrowed to ConstantsReader since RPN only reads constants;
GetConstants() asserts to ConstantsProvider for callers that need full access.
Added compile-time satisfaction checks for all sub-interfaces.
| -rw-r--r-- | internal/rpn/constants.go | 28 | ||||
| -rw-r--r-- | internal/rpn/rpn_state.go | 6 |
2 files changed, 29 insertions, 5 deletions
diff --git a/internal/rpn/constants.go b/internal/rpn/constants.go index fd15c2a..d497076 100644 --- a/internal/rpn/constants.go +++ b/internal/rpn/constants.go @@ -11,17 +11,41 @@ import ( "sync" ) -// ConstantsProvider defines the interface for reading constant values. -type ConstantsProvider interface { +// ConstantsReader defines the interface for reading constant values. +type ConstantsReader interface { GetConstant(name string) (float64, bool) ListConstants() []ConstantInfo Count() int HasConstant(name string) bool +} + +// ConstantsWriter defines the interface for writing constant values. +type ConstantsWriter interface { SetConstant(name string, value float64) error +} + +// ConstantsAdmin defines the interface for administrative constant operations. +type ConstantsAdmin interface { ClearConstants() ReloadBuiltInConstants() } +// ConstantsProvider combines ConstantsReader, ConstantsWriter, and ConstantsAdmin +// for full constant storage access. +type ConstantsProvider interface { + ConstantsReader + ConstantsWriter + ConstantsAdmin +} + +// Ensure Constants implements all constant sub-interfaces at compile time. +var ( + _ ConstantsReader = (*Constants)(nil) + _ ConstantsWriter = (*Constants)(nil) + _ ConstantsAdmin = (*Constants)(nil) + _ ConstantsProvider = (*Constants)(nil) +) + // ConstantInfo represents a single constant with its name and value. type ConstantInfo struct { Name string diff --git a/internal/rpn/rpn_state.go b/internal/rpn/rpn_state.go index e99a02d..abb9ab8 100644 --- a/internal/rpn/rpn_state.go +++ b/internal/rpn/rpn_state.go @@ -13,7 +13,7 @@ import ( type RPN struct { mu sync.RWMutex vars VariableStore - consts ConstantsProvider + consts ConstantsReader ops OperationsProvider opRegistry *OperatorRegistry assignHandler *assignmentHandler @@ -27,7 +27,7 @@ func NewRPN(vars VariableStore, reg ...*MetricRegistry) *RPN { consts := NewConstants() ops := NewOperations(vars, reg...) ops.SetMode(FloatMode) // Set default mode - ops.SetConstants(consts) // Share the same ConstantsProvider + ops.SetConstants(consts) // Share the same constants provider return &RPN{ vars: vars, consts: consts, @@ -42,7 +42,7 @@ func NewRPN(vars VariableStore, reg ...*MetricRegistry) *RPN { // GetConstants returns the constants provider. // This method is thread-safe for concurrent reads. func (r *RPN) GetConstants() ConstantsProvider { - return r.consts + return r.consts.(ConstantsProvider) } // GetMode returns the current calculation mode. |
