X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDX%2FStep%2FBacktrack.pm;h=0da00a6a7df9903e03161eac02a53678926840e0;hb=b35f3e3b746ff1a6ab0d1223de3abd1118ce219d;hp=865073a23f276c8c2966f3be6224d3256ccc4251;hpb=d6b0c811a7afc5fc2ca97f72ed1ab37b5c117e25;p=scpubgit%2FDX.git diff --git a/lib/DX/Step/Backtrack.pm b/lib/DX/Step/Backtrack.pm index 865073a..0da00a6 100644 --- a/lib/DX/Step/Backtrack.pm +++ b/lib/DX/Step/Backtrack.pm @@ -1,25 +1,76 @@ package DX::Step::Backtrack; +use DX::DependencyMap; +use DX::Utils qw(format_deps compact_deps); use DX::Class; with 'DX::Role::Step'; -#has resolution_space => (is => 'ro', isa => ResolutionSpace, required => 1); +has resolution_space => (is => 'ro', isa => ResolutionSpace, required => 1); sub apply_to { my ($self, $ss) = @_; - trace backtrack => [ statement => [ [ symbol => 'backtrack' ] ] ]; - foreach my $adj (@{$ss->decisions_taken}) { + my $rspace = $self->resolution_space; + trace backtrack => [ statement => [ + [ symbol => 'backtrack' ], + [ 'enter_block' ] + ] ]; + trace backtrack => [ word_and_body => [ + 'failure_dependencies', + format_deps($rspace->geometry_depends_on) + ] ]; + my $dmap = DX::DependencyMap->new_empty + ->with_dependencies_for( + backtrack => $rspace->geometry_depends_on + ); + DECISION: foreach my $adj (@{$ss->decisions_taken}) { my ($rspace_was, $ss_was) = @$adj; - trace rspace => [ statement => [ - [ symbol => 'remaining' ], - @{$rspace_was->remaining_resolution_space->for_deparse->[1]} + trace backtrack => [ statement => [ + [ symbol => 'decision' ], + [ pairs => [ + [ for => $rspace_was->proposition, ], + [ aperture => [ block => [ + map [ statement => [ + [ symbol => (split '::', ${$_->[0]})[-1] ], + [ value_path => [ @{$_}[1..$#$_] ] ], + ] ], @{$rspace_was->aperture} + ] ] ] + ] ] ] ]; - return $ss_was->but( - next_step => $rspace_was->remaining_resolution_space->next_step - ); + foreach my $event (@{$rspace_was->aperture}) { + if ($dmap->dependents_of($event)) { + my $remain = $rspace_was->remaining_resolution_space; + if (@{$remain->members}) { + trace backtrack => [ statement => [ + [ symbol => 'found_alternative' ] + ] ]; + trace backtrack => [ 'leave_block' ]; + return $ss_was->but( + next_step => $remain->with_geometry_dependencies( + $dmap->dependencies_for('backtrack') + )->next_step + ); + } + $dmap = $dmap->with_dependencies_for( + backtrack => $rspace_was->geometry_depends_on + ); + trace backtrack => [ word_and_body => [ + 'failure_dependencies', + format_deps(compact_deps($dmap->dependencies_for('backtrack'))) + ] ]; + next DECISION; + } + } + trace backtrack => [ statement => [ [ symbol => 'non_relevant' ] ] ]; } - return $ss->but(next_step => $ss->on_exhaustion_step); + trace backtrack => [ statement => [ [ symbol => 'exhaustion' ] ] ]; + trace backtrack => [ 'leave_block' ]; + return $ss->but( + next_step + => $ss->on_exhaustion_step->but( + exhaustion_depends_on => $dmap->dependencies_for('backtrack') + ) + ); } 1;