alternatives are correct rather than always backtrack
[scpubgit/DX.git] / lib / DX / Step / ResolveProposition.pm
CommitLineData
a3104d41 1package DX::Step::ResolveProposition;
9d759b64 2
614f3d93 3use DX::Step::EnterRecheck;
d6b0c811 4use DX::Step::CompleteResolution;
7af7ed1e 5use DX::Step::Backtrack;
614f3d93 6
c99dbb05 7use DX::Utils qw(expand_deps);
614f3d93 8
9d759b64 9use DX::Class;
10
3e465d5d 11with 'DX::Role::Step';
9d759b64 12
839c0018 13has resolution_space => (is => 'ro', isa => ResolutionSpace);
3e465d5d 14
4aeeab1e 15sub but_first {
16 my ($self, @actions) = @_;
17 $self->but(actions => [ @actions, @{$self->actions} ]);
18}
19
0498469a 20sub but_with_dependencies_on {
21 my ($self, @deps) = @_;
22 $self->but(depends_on => [ @{$self->depends_on}, @deps ]);
23}
24
9d759b64 25sub apply_to {
7af7ed1e 26 my ($self, $old_ss) = @_;
ec22d762 27 my $rspace = $self->resolution_space;
28 my $prop = $rspace->proposition;
29 my $res = $rspace->next_resolution;
30 my $vdeps = $res->veracity_depends_on;
5b6cab1b 31 trace resolve => [ statement => [
32 [ symbol => 'resolve' ],
33 [ block => [
34 [ statement => [
35 [ symbol => 'proposition' ],
ec22d762 36 @{$prop->for_deparse->[1]},
5b6cab1b 37 ] ],
ec22d762 38 (@{$res->actions}
5b6cab1b 39 ? [ statement => [
40 [ symbol => 'actions' ],
ec22d762 41 [ block => $res->actions ],
5b6cab1b 42 ] ]
43 : ()),
93de8fb0 44 [ statement => [
45 [ symbol => 'depends_on' ],
6162b001 46 [ block => [
47 map [ statement => [
48 [ symbol => (split '::', ${$_->[0]})[-1] ],
93de8fb0 49 [ value_path => [ @{$_}[1..$#$_] ] ]
ec22d762 50 ] ], @{$vdeps}
93de8fb0 51 ] ],
52 ] ],
5b6cab1b 53 ] ]
54 ] ];
7af7ed1e 55 my $ss = $old_ss->but(
d6b0c811 56 next_step => DX::Step::CompleteResolution->new(
57 original_search_state => $old_ss,
58 resolution_space => $rspace,
59 )
f696251f 60 );
2ac94761 61 my $old_hyp = $old_ss->current_hypothesis;
77065529 62 (my $hyp, my @recheck) = $old_hyp->with_resolution(
ec22d762 63 $prop, $vdeps, $res->actions
cdca8723 64 );
b9314f34 65 unless ($hyp) {
66 return $ss->but(
67 next_step
68 => $rspace->remaining_resolution_space->next_step
69 );
70 }
8cf755df 71 return $ss->but(current_hypothesis => $hyp) unless @recheck;
72 return $ss->but(
73 current_hypothesis => $hyp,
614f3d93 74 next_step => DX::Step::EnterRecheck->new(
31753090 75 proposition_list => \@recheck,
8cf755df 76 on_completion_step => $ss->next_step,
54da7534 77 resolution_space => $rspace,
614f3d93 78 ),
310662b5 79 );
9d759b64 80}
81
821;