OctaveSpanTimeline constructor
OctaveSpanTimeline(
- 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]);
}