diff --git a/README.md b/README.md index e3f7c1f..206da18 100644 --- a/README.md +++ b/README.md @@ -332,6 +332,7 @@ type DozenWidgets struct{} func (DozenWidgets) ToBase(v float64) float64 { return v * 12 } func (DozenWidgets) FromBase(v float64) float64 { return v / 12 } +func (DozenWidgets) Dimension() Widget { return Widget{} } widgets := quant.New[Widget](2, DozenWidgets{}).To(DozenWidgets{}) // 2 ``` diff --git a/quantity_test.go b/quantity_test.go index 5c4d5c8..bd35e12 100644 --- a/quantity_test.go +++ b/quantity_test.go @@ -418,6 +418,7 @@ type testDozenWidgets struct{} func (testDozenWidgets) ToBase(v float64) float64 { return v * 12 } func (testDozenWidgets) FromBase(v float64) float64 { return v / 12 } +func (testDozenWidgets) Dimension() testWidgets { return testWidgets{} } func TestCustomDimensionAndUnit(t *testing.T) { q := quant.New[testWidgets](2, testDozenWidgets{}) diff --git a/unit.go b/unit.go index 8ebbe67..d57201d 100644 --- a/unit.go +++ b/unit.go @@ -14,6 +14,7 @@ type Dimension interface { type Unit[D Dimension] interface { ToBase(float64) float64 FromBase(float64) float64 + Dimension() D } // BuiltinUnit is the concrete unit type used by quant's built-in units. @@ -30,6 +31,12 @@ func (u BuiltinUnit[D]) FromBase(v float64) float64 { return v/u.factor - u.offset } +// Dimension identifies the dimension a built-in unit belongs to. It is part +// of Unit's method set so a unit cannot be passed to a different dimension. +func (u BuiltinUnit[D]) Dimension() D { + return *new(D) +} + type scaleUnit[D Dimension] = BuiltinUnit[D] const (