parse<E> static method

List<Range<E>> parse<E>(
  1. String source, {
  2. String rangeSeparator = '–',
  3. String nonConsecutiveSeparator = ', ',
  4. List<StringParser<E>>? chain,
})

Parses source as a compressed range list.

Example:

RangeIterableExtension.parse('C–E♭, G♯–B', chain: Note.parsers) == [
  (from: Note.c, to: Note.e.flat),
  (from: Note.g.sharp, to: Note.b),
]

Implementation

static List<Range<E>> parse<E>(
  String source, {
  String rangeSeparator = '–',
  String nonConsecutiveSeparator = ', ',
  List<StringParser<E>>? chain,
}) => source
    .split(nonConsecutiveSeparator)
    .map((range) {
      final List(:first, :last) = range.split(rangeSeparator);
      final from = first.trim();
      final to = last.trim();

      return (
        from: (chain?.parse(from) ?? from) as E,
        to: (chain?.parse(to) ?? to) as E,
      );
    })
    .toList(growable: false);