chained rechecks
[scpubgit/DX.git] / lib / DX / Step / EnterRecheck.pm
CommitLineData
614f3d93 1package DX::Step::EnterRecheck;
2
251177ea 3use DX::Step::CompleteRecheck;
4
614f3d93 5use DX::Class;
6
7with 'DX::Role::Step';
8
9has proposition_list => (is => 'ro', required => 1);
10
91543b62 11has on_completion_step => (is => 'ro', required => 1);
12
614f3d93 13sub apply_to {
14 my ($self, $old_ss) = @_;
15
16 my ($prop, @rest) = @{$self->proposition_list};
17
614f3d93 18 my $old_hyp = $old_ss->current_hypothesis;
19
20 # we should probably be doing something about pruning the scope
21 # but that's completely pointless until we have rules (and also,
22 # the lock_to_depth arg needs to come from the proposition somehow)
23
24 my $ap = DX::ActionPolicy::LockScope->new(
25 lock_to_depth => $old_hyp->scope->depth,
26 next_policy => $old_hyp->action_policy,
27 );
28
29 my $hyp = ref($old_hyp)->new(
30 scope => $old_hyp->scope,
31 resolved_propositions => DX::ResolvedPropositionSet->new_empty,
32 actions => [],
33 action_applications => [],
34 action_policy => $ap,
35 );
36
37 my $pseq = DX::PropositionSequence->new(
38 members => [ $prop ],
39 external_names => {},
40 internal_names => {},
41 );
42
31753090 43 my $next_step = (@rest
44 ? $self->but(proposition_list => \@rest)
45 : $self->on_completion_step);
46
614f3d93 47 trace 'step.recheck.hyp' => $hyp;
48
49 my $ss = DX::SearchState->new(
50 current_hypothesis => $hyp,
51 alternatives => [],
52 propositions => $pseq,
53 next_step => DX::Step::ConsiderProposition->new(
54 proposition => $prop,
55 ),
56 is_solution_state => 0,
57 on_exhaustion_step => undef,
251177ea 58 on_solution_step => DX::Step::CompleteRecheck->new(
31753090 59 resume_search_state => $old_ss->but(next_step => $next_step),
251177ea 60 was_recheck_for => $prop,
61 ),
614f3d93 62 );
63
64 return $ss;
65}
66
671;