1 package DX::Step::EnterRecheck;
3 use DX::Step::CompleteRecheck;
4 use DX::Step::FailRecheck;
10 has proposition_list => (
11 is => 'ro', isa => PropositionList, required => 1
14 has on_completion_step => (is => 'ro', isa => Step, required => 1);
16 has on_failure_step => (is => 'ro', isa => Maybe[Step], required => 1);
19 my ($self, $old_ss) = @_;
21 my ($prop, @rest) = @{$self->proposition_list};
23 trace recheck => [ statement => [
24 [ symbol => 'recheck' ],
25 @{$prop->for_deparse->[1]},
29 my $old_hyp = $old_ss->current_hypothesis;
31 # we should probably be doing something about pruning the scope
32 # but that's completely pointless until we have rules (and also,
33 # the lock_to_depth arg needs to come from the proposition somehow)
35 my $ap = DX::ActionPolicy::LockScope->new(
36 lock_to_depth => $old_hyp->scope->depth,
37 next_policy => $old_hyp->action_policy,
40 my $hyp = ref($old_hyp)->new(
41 scope => $old_hyp->scope,
42 resolved_propositions => DX::ResolvedPropositionSet->new_empty,
44 action_applications => [],
48 my $pseq = DX::PropositionSequence->new(
54 my $next_step = (@rest
55 ? $self->but(proposition_list => \@rest)
56 : $self->on_completion_step);
58 my $ss = DX::SearchState->new(
59 current_hypothesis => $hyp,
60 decisions_taken => [],
61 propositions => $pseq,
62 next_step => DX::Step::ConsiderProposition->new(
65 is_solution_state => 0,
66 on_solution_step => DX::Step::CompleteRecheck->new(
67 resume_search_state => $old_ss->but(next_step => $next_step),
68 was_recheck_for => $prop,
70 on_exhaustion_step => DX::Step::FailRecheck->new(
71 resume_search_state => $old_ss->but(next_step => $self->on_failure_step),