blob: 7634f0c7c8ecf7133596636d416f39a979773771 [file] [log] [blame]
import 'package:meta/meta.dart';
import '../../core/parser.dart';
import 'code.dart';
import 'parser.dart';
import 'predicate.dart';
/// Returns a parser that accepts any character in the range
/// between [start] and [stop].
@useResult
Parser<String> range(String start, String stop, [String? message]) =>
CharacterParser(
RangeCharPredicate(toCharCode(start), toCharCode(stop)),
message ??
'[${toReadableString(start)}-${toReadableString(stop)}] expected');
class RangeCharPredicate implements CharacterPredicate {
RangeCharPredicate(this.start, this.stop)
: assert(start <= stop, 'Invalid range character range: $start-$stop');
final int start;
final int stop;
@override
bool test(int value) => start <= value && value <= stop;
@override
bool isEqualTo(CharacterPredicate other) =>
other is RangeCharPredicate && other.start == start && other.stop == stop;
}