parseOn method
Primitive method doing the actual parsing.
The method is overridden in concrete subclasses to implement the
parser specific logic. The methods takes a parse context
and
returns the resulting context, which is either a Success or
Failure context.
Implementation
@override
Result<SeparatedList<R, S>> parseOn(Context context) {
var current = context;
final elements = <R>[];
final separators = <S>[];
while (elements.length < min) {
if (elements.isNotEmpty) {
final separation = separator.parseOn(current);
if (separation is Failure) return separation;
current = separation;
separators.add(separation.value);
}
final result = delegate.parseOn(current);
if (result is Failure) return result;
current = result;
elements.add(result.value);
}
while (elements.length < max) {
final previous = current;
if (elements.isNotEmpty) {
final separation = separator.parseOn(current);
if (separation is Failure) break;
current = separation;
separators.add(separation.value);
}
final result = delegate.parseOn(current);
if (result is Failure) {
if (elements.isNotEmpty) separators.removeLast();
return previous.success(SeparatedList(elements, separators));
}
current = result;
elements.add(result.value);
}
return current.success(SeparatedList(elements, separators));
}