inline _apply_to in ResolveProposition to clarify logic
[scpubgit/DX.git] / lib / DX / Step / ResolveProposition.pm
CommitLineData
a3104d41 1package DX::Step::ResolveProposition;
9d759b64 2
614f3d93 3use DX::Step::EnterRecheck;
7af7ed1e 4use DX::Step::Backtrack;
614f3d93 5
c99dbb05 6use DX::Utils qw(expand_deps);
614f3d93 7
9d759b64 8use DX::Class;
9
3e465d5d 10with 'DX::Role::Step';
9d759b64 11
839c0018 12has resolution_space => (is => 'ro', isa => ResolutionSpace);
3e465d5d 13
fe5af11f 14sub resolves { shift->resolution_space->proposition }
15
16sub current_resolution { shift->resolution_space->next_resolution }
17
18sub actions { shift->current_resolution->actions }
19
20sub depends_on { shift->current_resolution->veracity_depends_on }
9d759b64 21
4aeeab1e 22sub but_first {
23 my ($self, @actions) = @_;
24 $self->but(actions => [ @actions, @{$self->actions} ]);
25}
26
0498469a 27sub but_with_dependencies_on {
28 my ($self, @deps) = @_;
29 $self->but(depends_on => [ @{$self->depends_on}, @deps ]);
30}
31
9d759b64 32sub apply_to {
7af7ed1e 33 my ($self, $old_ss) = @_;
5b6cab1b 34 trace resolve => [ statement => [
35 [ symbol => 'resolve' ],
36 [ block => [
37 [ statement => [
38 [ symbol => 'proposition' ],
39 @{$self->resolves->for_deparse->[1]},
40 ] ],
41 (@{$self->actions}
42 ? [ statement => [
43 [ symbol => 'actions' ],
c99dbb05 44 [ block => $self->actions ],
5b6cab1b 45 ] ]
46 : ()),
93de8fb0 47 [ statement => [
48 [ symbol => 'depends_on' ],
6162b001 49 [ block => [
50 map [ statement => [
51 [ symbol => (split '::', ${$_->[0]})[-1] ],
93de8fb0 52 [ value_path => [ @{$_}[1..$#$_] ] ]
6162b001 53 ] ], @{$self->depends_on}
93de8fb0 54 ] ],
55 ] ],
5b6cab1b 56 ] ]
57 ] ];
1dcbfaf8 58 my $ns = do {
7af7ed1e 59 if (my $prop = $old_ss->next_proposition) {
86dbedb6 60 DX::Step::ConsiderProposition->new(
1dcbfaf8 61 proposition => $prop
62 )
63 } else {
7af7ed1e 64 $old_ss->on_solution_step
1dcbfaf8 65 }
66 };
7af7ed1e 67 my $ss = $old_ss->but(
68 next_step => $ns,
1c02730b 69 decisions_taken => [
70 [ $self->resolution_space, $old_ss ],
71 @{$old_ss->decisions_taken}
72 ],
f696251f 73 );
2ac94761 74 my $old_hyp = $old_ss->current_hypothesis;
77065529 75 (my $hyp, my @recheck) = $old_hyp->with_resolution(
cdca8723 76 $self->resolves, $self->depends_on, $self->actions
77 );
161534ff 78 return $ss->but(next_step => DX::Step::Backtrack->new) unless $hyp;
2ac94761 79 return $self->_recheck_for(
161534ff 80 $ss->but(current_hypothesis => $hyp),
2ac94761 81 @recheck
82 );
04844099 83}
84
2ac94761 85sub _recheck_for {
86 my ($self, $old_ss, @recheck) = @_;
49e9aea0 87
31753090 88 return $old_ss unless @recheck;
2ac94761 89
614f3d93 90 my $ss = $old_ss->but(
91 next_step => DX::Step::EnterRecheck->new(
31753090 92 proposition_list => \@recheck,
7af7ed1e 93 on_completion_step => $old_ss->next_step,
94 on_failure_step => DX::Step::Backtrack->new,
614f3d93 95 ),
310662b5 96 );
97
7af7ed1e 98 return $ss;
9d759b64 99}
100
1011;