seriesToLine function

Result<LineChartData, BridgeError> seriesToLine(
  1. SeriesResult result, {
  2. required BridgePalette palette,
  3. required BridgeFormatters formatters,
  4. SemanticColorResolver? resolver,
  5. TemporalSpacing temporalSpacing = TemporalSpacing.uniform,
  6. 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 [],
    ),
  );
}