): void {
output.state
? this.unmemory()
: this.backtrack();
}
}
export function backtrack(parser: P): P;
export function backtrack(parser: Parser): Parser {
assert(parser);
return always([
(input, output) => {
const { backtrack, segment, position, range, linebreak } = input;
backtrack.memory({
segment,
position,
range,
linebreak,
});
output.push();
output.labels.push(new List());
output.annotations.push(new List());
output.references.push(new List());
return output.context;
},
parser,
({ backtrack }, output) => {
backtrack.handle(output);
if (output.state) {
output.import(output.pop());
output.labels.at(-2)!.import(output.labels.pop()!);
output.annotations.at(-2)!.import(output.annotations.pop()!);
output.references.at(-2)!.import(output.references.pop()!);
}
else {
output.pop();
output.labels.pop();
output.annotations.pop();
output.references.pop();
}
return output.context;
},
]);
}