blob: f781fd99e288a27ac9c4544f81c43ad1fdd18c73 [file] [log] [blame]
import 'package:meta/meta.dart';
import '../../context/context.dart';
import '../../context/result.dart';
import '../../core/parser.dart';
import 'delegate.dart';
extension AndParserExtension<R> on Parser<R> {
/// Returns a parser (logical and-predicate) that succeeds whenever the
/// receiver does, but never consumes input.
///
/// For example, the parser `char('_').and().seq(identifier)` accepts
/// identifiers that start with an underscore character. Since the predicate
/// does not consume accepted input, the parser `identifier` is given the
/// ability to process the complete identifier.
@useResult
Parser<R> and() => AndParser<R>(this);
}
/// The and-predicate, a parser that succeeds whenever its delegate does, but
/// does not consume the input stream [Parr 1994, 1995].
class AndParser<R> extends DelegateParser<R, R> {
AndParser(super.delegate);
@override
Result<R> parseOn(Context context) {
final result = delegate.parseOn(context);
if (result.isSuccess) {
return context.success(result.value);
} else {
return result;
}
}
@override
int fastParseOn(String buffer, int position) {
final result = delegate.fastParseOn(buffer, position);
return result < 0 ? -1 : position;
}
@override
AndParser<R> copy() => AndParser<R>(delegate);
}