remove unused variable
[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
7248abc9 15has depends_on => (is => 'ro', isa => ArrayRef[DependencySpec], required => 1);
3e465d5d 16
ccf0d4fe 17has resolves => (is => 'ro', isa => Proposition);
18
3e465d5d 19has alternative_step => (is => 'ro', isa => Step);
9d759b64 20
4aeeab1e 21sub but_first {
22 my ($self, @actions) = @_;
23 $self->but(actions => [ @actions, @{$self->actions} ]);
24}
25
0498469a 26sub but_with_dependencies_on {
27 my ($self, @deps) = @_;
28 $self->but(depends_on => [ @{$self->depends_on}, @deps ]);
29}
30
9d759b64 31sub apply_to {
7af7ed1e 32 my ($self, $old_ss) = @_;
1dcbfaf8 33 my $ns = do {
7af7ed1e 34 if (my $prop = $old_ss->next_proposition) {
86dbedb6 35 DX::Step::ConsiderProposition->new(
1dcbfaf8 36 proposition => $prop
37 )
38 } else {
7af7ed1e 39 $old_ss->on_solution_step
1dcbfaf8 40 }
41 };
7af7ed1e 42 my $ss = $old_ss->but(
43 next_step => $ns,
76329453 44 (@{$self->actions}
df377b33 45 ? (adjustments_made => [
a3ff9ce3 46 [ $self, $old_ss ],
df377b33 47 @{$old_ss->adjustments_made}
7af7ed1e 48 ])
49 : ()
f696251f 50 ),
f696251f 51 );
7af7ed1e 52 my $new_ss = $self->_apply_to_ss($ss);
53 return $ss->but(next_step => DX::Step::Backtrack->new) unless $new_ss;
54 return $new_ss;
9d759b64 55}
56
2ac94761 57sub _apply_to_ss {
58 my ($self, $old_ss) = @_;
59 my $old_hyp = $old_ss->current_hypothesis;
77065529 60 (my $hyp, my @recheck) = $old_hyp->with_resolution(
cdca8723 61 $self->resolves, $self->depends_on, $self->actions
62 );
2ac94761 63 return undef unless $hyp;
64 return $self->_recheck_for(
65 $old_ss->but(current_hypothesis => $hyp),
66 @recheck
67 );
04844099 68}
69
2ac94761 70sub _recheck_for {
71 my ($self, $old_ss, @recheck) = @_;
49e9aea0 72
31753090 73 return $old_ss unless @recheck;
2ac94761 74
614f3d93 75 my $ss = $old_ss->but(
76 next_step => DX::Step::EnterRecheck->new(
31753090 77 proposition_list => \@recheck,
7af7ed1e 78 on_completion_step => $old_ss->next_step,
79 on_failure_step => DX::Step::Backtrack->new,
614f3d93 80 ),
310662b5 81 );
82
7af7ed1e 83 return $ss;
9d759b64 84}
85
861;