Keyed by the contract vocabulary rather than written out as
points…/lines…/gsplats… triplets, so adding a geometry type extends
every counter at once (and fails to compile until the producers supply it)
instead of needing a field, an accumulator and a reader per counter.
The element nouns (points / segments / splats) deliberately do NOT live
here: they belong to the display layer, which keeps per-type named fields on
DataLoadingStats because each is rendered with its own label and DOM
id. This shape is the aggregation model; the nouns are presentation.
Per-geometry-type counters, one entry per GeometryTypeName.
Keyed by the contract vocabulary rather than written out as
points…/lines…/gsplats…triplets, so adding a geometry type extends every counter at once (and fails to compile until the producers supply it) instead of needing a field, an accumulator and a reader per counter.The element nouns (points / segments / splats) deliberately do NOT live here: they belong to the display layer, which keeps per-type named fields on DataLoadingStats because each is rendered with its own label and DOM id. This shape is the aggregation model; the nouns are presentation.