package DX::State;
+use Return::MultiLevel qw(with_return);
+use DX::Op::FromCode;
use Moo;
has next_op => (is => 'ro', required => 1);
$var->bound_value; $var->clear_bound_value;
return $state->mark_choice($var) unless $var->bound_stream->is_exhausted;
}
+ if (our $No_Options_Handler) {
+ $No_Options_Handler->(undef);
+ }
die "Out of options";
}
sub run {
my ($state) = @_;
- while (my $op = $state->next_op) {
- $state = $op->run($state);
+ with_return {
+ my ($return) = @_;
+ local our $No_Options_Handler = $return;
+ while (my $op = $state->next_op) {
+ $state = $op->run($state);
+ }
+ return $state;
}
- return $state;
+}
+
+sub push_backtrack {
+ $_[0]->then(DX::Op::FromCode->new(code => sub { $_[1]->backtrack }));
}
1;