normalize method

void normalize()

Merge touching/overlapping spans that share attr + value.

Implementation

void normalize() {
  spans.removeWhere((UStyleSpan sp) => sp.end <= sp.start);
  spans.sort((UStyleSpan a, UStyleSpan b) => a.attr.index != b.attr.index ? a.attr.index - b.attr.index : a.start - b.start);
  final List<UStyleSpan> merged = <UStyleSpan>[];
  for (final UStyleSpan sp in spans) {
    if (merged.isNotEmpty) {
      final UStyleSpan last = merged.last;
      if (last.attr == sp.attr && last.value == sp.value && sp.start <= last.end) {
        if (sp.end > last.end) last.end = sp.end;
        continue;
      }
    }
    merged.add(sp.copy());
  }
  spans
    ..clear()
    ..addAll(merged);
}