1 package DX::Step::ResolveProposition;
3 use DX::Step::EnterRecheck;
4 use DX::Step::Backtrack;
6 use Types::Standard qw(ArrayRef);
7 use DX::Utils qw(deparse);
11 with 'DX::Role::Step';
13 has actions => (is => 'ro', isa => ArrayRef[Action], required => 1);
15 #has depends_on => (is => 'ro', isa => DependencyGroupList, required => 1);
17 has depends_on => (is => 'ro', required => 1, coerce => sub {
20 DEP: foreach my $dep (@$deps) {
21 my ($type, @path) = @$dep;
24 map { ref() ? @{$_->value_path or next DEP} : $_ } @path
30 has resolves => (is => 'ro', isa => Proposition);
32 has alternative_step => (is => 'ro', isa => Step);
35 my ($self, @actions) = @_;
36 $self->but(actions => [ @actions, @{$self->actions} ]);
39 sub but_with_dependencies_on {
40 my ($self, @deps) = @_;
41 $self->but(depends_on => [ @{$self->depends_on}, @deps ]);
45 my ($self, $old_ss) = @_;
47 if (my $prop = $old_ss->next_proposition) {
48 DX::Step::ConsiderProposition->new(
52 $old_ss->on_solution_step
55 my $alt_step = $self->alternative_step;
56 my $ss = $old_ss->but(
59 ? (adjustments_made => [
61 @{$old_ss->adjustments_made}
66 my $new_ss = $self->_apply_to_ss($ss);
67 return $ss->but(next_step => DX::Step::Backtrack->new) unless $new_ss;
72 my ($self, $old_ss) = @_;
73 my $old_hyp = $old_ss->current_hypothesis;
74 (my $hyp, my @recheck) = $old_hyp->with_resolution(
75 $self->resolves, $self->depends_on, $self->actions
77 return undef unless $hyp;
78 return $self->_recheck_for(
79 $old_ss->but(current_hypothesis => $hyp),
85 my ($self, $old_ss, @recheck) = @_;
87 return $old_ss unless @recheck;
89 my $ss = $old_ss->but(
90 next_step => DX::Step::EnterRecheck->new(
91 proposition_list => \@recheck,
92 on_completion_step => $old_ss->next_step,
93 on_failure_step => DX::Step::Backtrack->new,