finish adding type constraints
[scpubgit/DX.git] / lib / DX / QueryState.pm
CommitLineData
9eedd677 1package DX::QueryState;
2
384a5e93 3use DX::Scope;
4use DX::Hypothesis;
8c16d3c9 5use DX::SearchProcess;
384a5e93 6use DX::ResolvedPropositionSet;
7use DX::Value::Unset;
8use DX::ActionBuilder::UnsetValue;
9use DX::ActionPolicy::Allow;
10use DX::Utils qw(:builders);
9eedd677 11use DX::Class;
12
fa8f5696 13has predicates => (is => 'ro', isa => HashRef[Predicate], required => 1);
14
15has globals => (is => 'ro', isa => DictValue, required => 1);
16
17has proposition_sequence => (
18 is => 'ro', isa => PropositionSequence, required => 1
19);
9eedd677 20
cfae7810 21has search_process => (
22 is => 'lazy', isa => SearchProcess, builder => sub {
23 $_[0]->new_search_process_for($_[0]->proposition_sequence)
24 }, handles => { search_state => 'current_search_state' },
384a5e93 25);
26
cfae7810 27sub new_search_process_for {
384a5e93 28 my ($self, $prop_seq) = @_;
5f12a9d8 29 my @local_names = map { keys %{$_->introduced_names} }
384a5e93 30 @{$prop_seq->members};
31 my $scope = DX::Scope->new(
32 predicates => $self->predicates,
33 globals => $self->globals,
34 locals => [
35 dict(
36 map +($_ => DX::Value::Unset->new(
384a5e93 37 action_builder => DX::ActionBuilder::UnsetValue->new(
38 target_path => [ 0, $_ ],
39 )
40 )
41 ), @local_names
42 )
af69c845 43 ],
44 lex_map => {
45 map +($_ => [ 0, $_ ]), @local_names
46 }
384a5e93 47 );
48 my $hyp = DX::Hypothesis->new(
49 scope => $scope,
50 resolved_propositions => DX::ResolvedPropositionSet->new_empty,
384a5e93 51 actions => [],
e442aff8 52 action_applications => [],
384a5e93 53 action_policy => DX::ActionPolicy::Allow->new,
54 );
8c16d3c9 55 return DX::SearchProcess->new_for($hyp, $prop_seq);
384a5e93 56}
57
58sub with_additional_proposition {
59 my ($self, $prop) = @_;
60 my $prop_seq = $self->proposition_sequence
5f12a9d8 61 ->with_additional_proposition($prop);
cfae7810 62 my $sol_ss = $self->new_search_process_for($prop_seq)
31d445d3 63 ->find_solution;
f458fa2c 64 die "No solution\n" unless $sol_ss;
384a5e93 65 $self->but(
66 proposition_sequence => $prop_seq,
cfae7810 67 search_process => $sol_ss,
384a5e93 68 );
69}
70
f458fa2c 71sub with_forced_backtrack {
72 my ($self) = @_;
cfae7810 73 my $next_ss = $self->search_process->find_next_solution;
f458fa2c 74 die "No next solution\n" unless $next_ss;
cfae7810 75 $self->but(search_process => $next_ss);
f458fa2c 76}
77
9eedd677 781;