X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDX%2FSolver.pm;h=753abe5b3b87932dfd5fe5a8cfd87400993d3c80;hb=7ca660cb75c4248a653dd68036227e309faaac9b;hp=6300b23698126923dca548e80e9a1bc3a63d8c9f;hpb=9854aea02301c4a610b98f4ec3ee3bc749e91d45;p=scpubgit%2FDKit.git diff --git a/lib/DX/Solver.pm b/lib/DX/Solver.pm index 6300b23..753abe5 100644 --- a/lib/DX/Solver.pm +++ b/lib/DX/Solver.pm @@ -20,6 +20,28 @@ has observation_policy => (is => 'ro'); sub query { my ($self, @terms) = @_; + $self->_solve({ allow_actions => 0 }, @terms); +} + +sub solve { + my ($self, @terms) = @_; + $self->_solve({ allow_actions => 1 }, @terms); +} + +sub ensure { + my ($self, @terms) = @_; + my $rs = $self->_solve({ allow_actions => 1 }, @terms); + my $r = $rs->next; + while ($r and $r->actions and my @ind = $r->independent_actions) { + $self->run_action($_) for @ind; + $rs = $self->_solve({ allow_actions => 1 }, @terms); + $r = $rs->next; + } + return $r; +} + +sub _solve { + my ($self, $attrs, @terms) = @_; my $rule_set = $self->rule_set; my $head = $rule_set->expand_and_link(undef, @terms, [ 'materialize' ]); my $state = DX::State->new( @@ -30,6 +52,7 @@ sub query { last_choice => [], facts => $self->facts, rule_set => $rule_set, + %$attrs ); return DX::ResultStream->new( for_state => $state, @@ -41,6 +64,7 @@ sub query { sub run_action { my ($self, $action) = @_; + warn +(split('::', ref($action)))[-1]."\n"; my @invalidate = $action->run; while (my ($type, $value) = splice @invalidate, 0, 2) { $self->facts->{$type}->remove_value($value);