seriesToLine function
Result<LineChartData, BridgeError>
seriesToLine(
- SeriesResult result, {
- required BridgePalette palette,
- required BridgeFormatters formatters,
- SemanticColorResolver? resolver,
- TemporalSpacing temporalSpacing = TemporalSpacing.uniform,
- bool integerValued = false,
Maps a single SeriesResult to a one-line LineChartData.
Implementation
Result<LineChartData, BridgeError> seriesToLine(
SeriesResult result, {
required BridgePalette palette,
required BridgeFormatters formatters,
SemanticColorResolver? resolver,
TemporalSpacing temporalSpacing = TemporalSpacing.uniform,
bool integerValued = false,
}) {
if (!isChartableFieldType(result.measureFieldType)) {
return Err(unchartableValueError(result.measureFieldType));
}
final keys = [for (final b in result.buckets) b.key];
final spacingError = epochSpacingGuard(keys, temporalSpacing);
if (spacingError != null) return Err(spacingError);
final color = palette.resolve(
index: 0,
semanticTag: result.semanticTag,
key: result.buckets.isEmpty ? null : result.buckets.first.key,
resolver: resolver,
);
final positions = _xPositions(keys, temporalSpacing);
final numerics = [
for (final b in result.buckets) formatters.chartNumeric(b.value),
];
final points = <LinePoint>[];
for (var i = 0; i < numerics.length; i++) {
final y = numerics[i];
if (y == null) continue; // skip undefined buckets; line bridges the gap
points.add(LinePoint(x: positions[i], y: y));
}
return Ok(
assembleLineChartData(
series: [
LineSeriesData(name: result.measureLabel, points: points, color: color),
],
keys: keys,
positions: positions,
numericGrid: [numerics],
formatters: formatters,
temporalSpacing: temporalSpacing,
integerValued: integerValued,
unitType: result.measureFieldType,
legend: const [],
),
);
}