Commit | Line | Data |
a3104d41 |
1 | package DX::Step::ResolveProposition; |
9d759b64 |
2 | |
3e465d5d |
3 | use Types::Standard qw(ArrayRef); |
4016201b |
4 | use DX::Utils qw(deparse); |
9d759b64 |
5 | use DX::Class; |
6 | |
3e465d5d |
7 | with 'DX::Role::Step'; |
9d759b64 |
8 | |
3e465d5d |
9 | has actions => (is => 'ro', isa => ArrayRef[Action], required => 1); |
9d759b64 |
10 | |
3e465d5d |
11 | has depends_on => (is => 'ro', isa => DependencyGroupList, required => 1); |
12 | |
ccf0d4fe |
13 | has resolves => (is => 'ro', isa => Proposition); |
14 | |
3e465d5d |
15 | has alternative_step => (is => 'ro', isa => Step); |
9d759b64 |
16 | |
4aeeab1e |
17 | sub but_first { |
18 | my ($self, @actions) = @_; |
19 | $self->but(actions => [ @actions, @{$self->actions} ]); |
20 | } |
21 | |
0498469a |
22 | sub but_with_dependencies_on { |
23 | my ($self, @deps) = @_; |
24 | $self->but(depends_on => [ @{$self->depends_on}, @deps ]); |
25 | } |
26 | |
9d759b64 |
27 | sub apply_to { |
110fd002 |
28 | my ($self, $ss) = @_; |
29 | my $old_hyp = $ss->current_hypothesis; |
bcee3a69 |
30 | trace 'step.apply.old_hyp '.$self => $old_hyp; |
173a11ea |
31 | trace 'step.apply.actions '.$self => $self->actions; |
bcee3a69 |
32 | my $new_hyp = $self->_apply_to_hyp($old_hyp); |
c76de01d |
33 | return $ss->but(next_step => DX::Step::Backtrack->new) unless $new_hyp; |
bcee3a69 |
34 | trace 'step.apply.new_hyp '.$self => $new_hyp; |
1dcbfaf8 |
35 | my $ns = do { |
36 | if (my $prop = $ss->next_proposition($new_hyp)) { |
86dbedb6 |
37 | DX::Step::ConsiderProposition->new( |
1dcbfaf8 |
38 | proposition => $prop |
39 | ) |
40 | } else { |
41 | $ss->on_solution_step |
42 | } |
43 | }; |
96e5344d |
44 | my $alt_step = $self->alternative_step; |
f696251f |
45 | return ( |
46 | $ss->but( |
47 | current_hypothesis => $new_hyp, |
48 | next_step => $ns, |
96e5344d |
49 | ($alt_step |
50 | ? (alternatives => [ [ $old_hyp, $alt_step ], @{$ss->alternatives} ]) |
51 | : () |
52 | ), |
f696251f |
53 | ), |
f696251f |
54 | ); |
9d759b64 |
55 | } |
56 | |
57 | sub _apply_to_hyp { |
58 | my ($self, $old_hyp) = @_; |
77065529 |
59 | (my $hyp, my @recheck) = $old_hyp->with_resolution( |
cdca8723 |
60 | $self->resolves, $self->depends_on, $self->actions |
61 | ); |
77065529 |
62 | return undef unless $hyp; |
63 | if (@recheck) { |
64 | $hyp = $hyp->but_recheck_for(@recheck); |
65 | } |
66 | return $hyp; |
9d759b64 |
67 | } |
68 | |
69 | 1; |