Commit | Line | Data |
55131db4 |
1 | package DX::Step::Backtrack; |
2 | |
4db57c04 |
3 | use DX::DependencyMap; |
4 | use DX::Utils qw(format_deps); |
55131db4 |
5 | use DX::Class; |
6 | |
7 | with 'DX::Role::Step'; |
8 | |
4db57c04 |
9 | has resolution_space => (is => 'ro', isa => ResolutionSpace, required => 1); |
d6b0c811 |
10 | |
55131db4 |
11 | sub apply_to { |
12 | my ($self, $ss) = @_; |
4db57c04 |
13 | my $rspace = $self->resolution_space; |
14 | trace backtrack => [ statement => [ |
15 | [ symbol => 'backtrack' ], |
16 | [ statement => [ |
17 | [ symbol => 'because' ], |
18 | format_deps($rspace->geometry_depends_on) |
19 | ] ] |
20 | ] ]; |
21 | my $dmap = DX::DependencyMap->new_empty |
22 | ->with_dependencies_for( |
23 | backtrack => $rspace->geometry_depends_on |
24 | ); |
25 | |
1c02730b |
26 | foreach my $adj (@{$ss->decisions_taken}) { |
27 | my ($rspace_was, $ss_was) = @$adj; |
4db57c04 |
28 | $dmap = $dmap->with_dependencies_for( |
29 | backtrack => $rspace_was->geometry_depends_on |
30 | ); |
b63c427e |
31 | next unless @{$rspace_was->remaining_resolution_space->members}; |
c99dbb05 |
32 | trace rspace => [ statement => [ |
33 | [ symbol => 'remaining' ], |
34 | @{$rspace_was->remaining_resolution_space->for_deparse->[1]} |
35 | ] ]; |
1c02730b |
36 | return $ss_was->but( |
37 | next_step => $rspace_was->remaining_resolution_space->next_step |
38 | ); |
76329453 |
39 | } |
40 | return $ss->but(next_step => $ss->on_exhaustion_step); |
55131db4 |
41 | } |
42 | |
43 | 1; |