OctaveSpanTimeline constructor

OctaveSpanTimeline(
  1. Iterable<OctaveSpanEvent> events
)

Builds a timeline from events, which may arrive in any order.

Implementation

factory OctaveSpanTimeline(Iterable<OctaveSpanEvent> events) {
  final list = List<OctaveSpanEvent>.from(events);
  if (list.isEmpty) return empty;
  // Stable sort: `List.sort` is not guaranteed stable, so ties are broken by
  // the original index to keep "last collected wins" deterministic.
  final indexed = <MapEntry<int, OctaveSpanEvent>>[
    for (var i = 0; i < list.length; i++) MapEntry(i, list[i]),
  ];
  indexed.sort((a, b) {
    final m = a.value.measureIndex.compareTo(b.value.measureIndex);
    if (m != 0) return m;
    final o = a.value.onset.compareTo(b.value.onset);
    if (o != 0) return o;
    return a.key.compareTo(b.key);
  });
  return OctaveSpanTimeline._([for (final e in indexed) e.value]);
}