generate method

List<StackSeries<T>> generate(
  1. List<T> data
)

Generates stacked series from the given data.

Implementation

List<StackSeries<T>> generate(List<T> data) {
  if (data.isEmpty || keys.isEmpty) return [];

  // Order keys
  final orderedKeys = _orderKeys(data);

  // Calculate raw stacks
  final series = <StackSeries<T>>[];

  for (final key in orderedKeys) {
    final points = <StackPoint<T>>[];

    for (int i = 0; i < data.length; i++) {
      final v = value(data[i], key);
      points.add(StackPoint<T>(
        data: data[i],
        index: i,
        value: v,
        y0: 0,
        y1: v,
      ));
    }

    series.add(StackSeries<T>(
      key: key,
      points: points,
    ));
  }

  // Stack the values
  for (int i = 0; i < data.length; i++) {
    double y0 = 0;
    for (final s in series) {
      final point = s.points[i];
      final v = point.value;
      s.points[i] = StackPoint<T>(
        data: point.data,
        index: point.index,
        value: v,
        y0: y0,
        y1: y0 + v,
      );
      y0 += v;
    }
  }

  // Apply offset
  _applyOffset(series, data.length);

  return series;
}