selection method
Implementation
(int, int)? selection(int anchor, int focus, {int? previousFocus}) {
if (excludedBlockIds.isEmpty) return (anchor, focus);
final spans = ranges;
if (spans.isEmpty) return null;
if (anchor == focus) {
if (contains(focus)) return (focus, focus);
final forward = previousFocus != null && focus > previousFocus;
final chosen = forward
? spans.where((r) => r.$1 > focus).firstOrNull?.$1 ?? spans.last.$2
: spans.where((r) => r.$2 < focus).lastOrNull?.$2 ?? spans.first.$1;
return (chosen, chosen);
}
final span =
spans.where((r) => anchor >= r.$1 && anchor <= r.$2).firstOrNull ??
spans
.where(
(r) =>
previousFocus != null &&
previousFocus >= r.$1 &&
previousFocus <= r.$2,
)
.firstOrNull ??
spans.first;
return (anchor.clamp(span.$1, span.$2), focus.clamp(span.$1, span.$2));
}