rename alternatives to adjustments
[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
3e465d5d 6use Types::Standard qw(ArrayRef);
4016201b 7use DX::Utils qw(deparse);
614f3d93 8
9d759b64 9use DX::Class;
10
3e465d5d 11with 'DX::Role::Step';
9d759b64 12
3e465d5d 13has actions => (is => 'ro', isa => ArrayRef[Action], required => 1);
9d759b64 14
b413e0b9 15#has depends_on => (is => 'ro', isa => DependencyGroupList, required => 1);
16
17has depends_on => (is => 'ro', required => 1, coerce => sub {
8c6c9551 18 my ($deps) = @_;
b413e0b9 19 my @exp;
8c6c9551 20 DEP: foreach my $dep (@$deps) {
21 my ($type, @path) = @$dep;
22 push @exp, [
23 $type,
24 map { ref() ? @{$_->value_path or next DEP} : $_ } @path
25 ];
26 }
27 \@exp
b413e0b9 28});
3e465d5d 29
ccf0d4fe 30has resolves => (is => 'ro', isa => Proposition);
31
3e465d5d 32has alternative_step => (is => 'ro', isa => Step);
9d759b64 33
4aeeab1e 34sub but_first {
35 my ($self, @actions) = @_;
36 $self->but(actions => [ @actions, @{$self->actions} ]);
37}
38
0498469a 39sub but_with_dependencies_on {
40 my ($self, @deps) = @_;
41 $self->but(depends_on => [ @{$self->depends_on}, @deps ]);
42}
43
9d759b64 44sub apply_to {
7af7ed1e 45 my ($self, $old_ss) = @_;
1dcbfaf8 46 my $ns = do {
7af7ed1e 47 if (my $prop = $old_ss->next_proposition) {
86dbedb6 48 DX::Step::ConsiderProposition->new(
1dcbfaf8 49 proposition => $prop
50 )
51 } else {
7af7ed1e 52 $old_ss->on_solution_step
1dcbfaf8 53 }
54 };
96e5344d 55 my $alt_step = $self->alternative_step;
7af7ed1e 56 my $ss = $old_ss->but(
57 next_step => $ns,
58 ($alt_step
df377b33 59 ? (adjustments_made => [
38113b88 60 [ $self, $old_ss->current_hypothesis ],
df377b33 61 @{$old_ss->adjustments_made}
7af7ed1e 62 ])
63 : ()
f696251f 64 ),
f696251f 65 );
7af7ed1e 66 my $new_ss = $self->_apply_to_ss($ss);
67 return $ss->but(next_step => DX::Step::Backtrack->new) unless $new_ss;
68 return $new_ss;
9d759b64 69}
70
2ac94761 71sub _apply_to_ss {
72 my ($self, $old_ss) = @_;
73 my $old_hyp = $old_ss->current_hypothesis;
77065529 74 (my $hyp, my @recheck) = $old_hyp->with_resolution(
cdca8723 75 $self->resolves, $self->depends_on, $self->actions
76 );
2ac94761 77 return undef unless $hyp;
78 return $self->_recheck_for(
79 $old_ss->but(current_hypothesis => $hyp),
80 @recheck
81 );
04844099 82}
83
2ac94761 84sub _recheck_for {
85 my ($self, $old_ss, @recheck) = @_;
49e9aea0 86
31753090 87 return $old_ss unless @recheck;
2ac94761 88
614f3d93 89 my $ss = $old_ss->but(
90 next_step => DX::Step::EnterRecheck->new(
31753090 91 proposition_list => \@recheck,
7af7ed1e 92 on_completion_step => $old_ss->next_step,
93 on_failure_step => DX::Step::Backtrack->new,
614f3d93 94 ),
310662b5 95 );
96
7af7ed1e 97 return $ss;
9d759b64 98}
99
1001;