format aperture in backtrack trace
[scpubgit/DX.git] / lib / DX / Step / Backtrack.pm
CommitLineData
55131db4 1package DX::Step::Backtrack;
2
4db57c04 3use DX::DependencyMap;
3cc9323e 4use DX::Utils qw(format_deps compact_deps);
55131db4 5use DX::Class;
6
7with 'DX::Role::Step';
8
4db57c04 9has resolution_space => (is => 'ro', isa => ResolutionSpace, required => 1);
d6b0c811 10
55131db4 11sub apply_to {
12 my ($self, $ss) = @_;
4db57c04 13 my $rspace = $self->resolution_space;
14 trace backtrack => [ statement => [
15 [ symbol => 'backtrack' ],
3cc9323e 16 [ 'enter_block' ]
17 ] ];
72304627 18 trace backtrack => [ word_and_body => [
19 'failure_dependencies',
3cc9323e 20 format_deps($rspace->geometry_depends_on)
4db57c04 21 ] ];
22 my $dmap = DX::DependencyMap->new_empty
23 ->with_dependencies_for(
24 backtrack => $rspace->geometry_depends_on
25 );
3cc9323e 26 DECISION: foreach my $adj (@{$ss->decisions_taken}) {
1c02730b 27 my ($rspace_was, $ss_was) = @$adj;
3cc9323e 28 trace backtrack => [ statement => [
29 [ symbol => 'decision' ],
30 [ pairs => [
b35f3e3b 31 [ for => $rspace_was->proposition, ],
32 [ aperture => [ block => [
33 map [ statement => [
34 [ symbol => (split '::', ${$_->[0]})[-1] ],
35 [ value_path => [ @{$_}[1..$#$_] ] ],
36 ] ], @{$rspace_was->aperture}
37 ] ] ]
3cc9323e 38 ] ]
c99dbb05 39 ] ];
3cc9323e 40 foreach my $event (@{$rspace_was->aperture}) {
41 if ($dmap->dependents_of($event)) {
42 my $remain = $rspace_was->remaining_resolution_space;
43 if (@{$remain->members}) {
44 trace backtrack => [ statement => [
45 [ symbol => 'found_alternative' ]
46 ] ];
47 trace backtrack => [ 'leave_block' ];
48 return $ss_was->but(
49 next_step => $remain->with_geometry_dependencies(
50 $dmap->dependencies_for('backtrack')
51 )->next_step
52 );
53 }
54 $dmap = $dmap->with_dependencies_for(
55 backtrack => $rspace_was->geometry_depends_on
56 );
72304627 57 trace backtrack => [ word_and_body => [
58 'failure_dependencies',
3cc9323e 59 format_deps(compact_deps($dmap->dependencies_for('backtrack')))
60 ] ];
61 next DECISION;
62 }
63 }
64 trace backtrack => [ statement => [ [ symbol => 'non_relevant' ] ] ];
76329453 65 }
3cc9323e 66 trace backtrack => [ statement => [ [ symbol => 'exhaustion' ] ] ];
67 trace backtrack => [ 'leave_block' ];
68 return $ss->but(
69 next_step
70 => $ss->on_exhaustion_step->but(
71 exhaustion_depends_on => $dmap->dependencies_for('backtrack')
72 )
73 );
55131db4 74}
75
761;