summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-24 14:05:35 +0300
committerPaul Buetow <paul@buetow.org>2026-05-24 14:05:35 +0300
commit7c9f67ff1e149dc28afe59d14bbc59d7695422ad (patch)
tree701070708fcd2a15d67d09d0cdcae0c32d929a52
parentbe23ab5bd3ac953a0de50aeef6569ee783982d81 (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.go28
-rw-r--r--internal/rpn/rpn_state.go6
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.