6 use List::Util qw(reduce);
9 has rule_set => (is => 'lazy', handles => [ 'add_rule' ], builder => sub {
13 has facts => (is => 'ro', required => 1);
15 has observation_policy => (is => 'ro');
18 my ($self, $vars, @terms) = @_;
19 my $rule_set = $self->rule_set;
20 push @terms, map +[ materialize => $_ ], @$vars;
21 my $head = $rule_set->expand_and_link(undef, @terms);
22 my $state = DX::State->new(
28 facts => $self->facts,
29 rule_set => $rule_set,
30 )->assign_vars(map +($_ => {}), @$vars);
31 return DX::ResultStream->new(
33 ($self->observation_policy
34 ? (observation_policy => $self->observation_policy)
40 my ($self, $action) = @_;
41 my @invalidate = $action->run;
42 while (my ($type, $value) = splice @invalidate, 0, 2) {
43 $self->facts->{$type}->remove_value($value);