X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDX%2FState.pm;h=7ef08c7c82f5bb6beb5aa0267b451faea6f57aba;hb=71217e421021100f3b07945357bd2fdaac638c4b;hp=83e8cc3b260b8fdaa29553e70a995695391224f0;hpb=5ef4d923edc14eadf67d64e92001f2f7bfa63986;p=scpubgit%2FDKit.git diff --git a/lib/DX/State.pm b/lib/DX/State.pm index 83e8cc3..7ef08c7 100644 --- a/lib/DX/State.pm +++ b/lib/DX/State.pm @@ -1,7 +1,7 @@ package DX::State; use Return::MultiLevel qw(with_return); -use DX::Op::FromCode; +use DX::Op::Backtrack; use Scalar::Util qw(blessed); use Moo; @@ -97,23 +97,36 @@ sub then { sub return_from_run { my (undef, $return) = @_; - (our $Nonlocal_Return)->($return); + (our $Run_Return)->($return); +} + +sub return_from_op { + my (undef, $return) = @_; + if (our $Op_Return) { + $Op_Return->($return); + } } sub run { my ($state) = @_; with_return { my ($return) = @_; - local our $Nonlocal_Return = $return; + local our $Run_Return = $return; while (my $op = $state->next_op) { - $state = $op->run($state); + my $backtrack = with_return { + my ($return) = @_; + local our $Op_Return = $return; + $state = $op->run($state); + return; + }; + if ($backtrack) { $state = $state->backtrack } } return $state; } } sub push_backtrack { - $_[0]->then(DX::Op::FromCode->new(code => sub { $_[1]->backtrack })); + $_[0]->then(DX::Op::Backtrack->new); } sub but {