allocate new locals in consider instead of up-front
[scpubgit/DX.git] / lib / DX / QueryState.pm
index 68f4638..cd54b82 100644 (file)
@@ -1,9 +1,8 @@
 package DX::QueryState;
 
-use Types::Standard qw(HashRef);
 use DX::Scope;
 use DX::Hypothesis;
-use DX::SearchState;
+use DX::SearchProcess;
 use DX::ResolvedPropositionSet;
 use DX::Value::Unset;
 use DX::ActionBuilder::UnsetValue;
@@ -19,52 +18,50 @@ has proposition_sequence => (
   is => 'ro', isa => PropositionSequence, required => 1
 );
 
-has search_state => (
-  is => 'lazy', builder => sub {
-    $_[0]->new_search_state_for($_[0]->proposition_sequence)
-  },
+has search_process => (
+  is => 'lazy', isa => SearchProcess, builder => sub {
+    $_[0]->new_search_process_for($_[0]->proposition_sequence)
+  }, handles => { search_state => 'current_search_state' },
 );
 
-sub new_search_state_for {
+sub new_search_process_for {
   my ($self, $prop_seq) = @_;
-  my @local_names = map { keys %{$_->introduces_names} }
+  my @local_names = map { keys %{$_->introduced_names} }
                       @{$prop_seq->members};
   my $scope = DX::Scope->new(
     predicates => $self->predicates,
     globals => $self->globals,
-    locals => [
-      dict(
-        map +($_ => DX::Value::Unset->new(
-                      identity_path => [ 0, $_ ],
-                      action_builder => DX::ActionBuilder::UnsetValue->new(
-                        target_path => [ 0, $_ ],
-                      )
-                    )
-        ), @local_names
-      )
-    ]
+    locals => [ dict() ],
+    lex_map => { }
   );
   my $hyp = DX::Hypothesis->new(
     scope => $scope,
     resolved_propositions => DX::ResolvedPropositionSet->new_empty,
-    outstanding_propositions => $prop_seq->members,
     actions => [],
+    action_applications => [],
     action_policy => DX::ActionPolicy::Allow->new,
   );
-  return DX::SearchState->new(
-    current_hypothesis => $hyp,
-    alternatives => [],
-  );
+  return DX::SearchProcess->new_for($hyp, $prop_seq);
 }
 
 sub with_additional_proposition {
   my ($self, $prop) = @_;
   my $prop_seq = $self->proposition_sequence
-                      ->but_append_proposition($prop);
+                      ->with_additional_proposition($prop);
+  my $sol_ss = $self->new_search_process_for($prop_seq)
+                    ->find_solution;
+  die "No solution\n" unless $sol_ss;
   $self->but(
     proposition_sequence => $prop_seq,
-    search_state => $self->new_search_state_for($prop_seq)
+    search_process => $sol_ss,
   );
 }
 
+sub with_forced_backtrack {
+  my ($self) = @_;
+  my $next_ss = $self->search_process->find_next_solution;
+  die "No next solution\n" unless $next_ss;
+  $self->but(search_process => $next_ss);
+}
+
 1;