Commit | Line | Data |
b40e416a |
1 | package DX::Solver; |
2 | |
3 | use DX::RuleSet; |
4 | use DX::State; |
5 | use DX::ResultStream; |
6 | use List::Util qw(reduce); |
7 | use Moo; |
8 | |
9 | has rule_set => (is => 'lazy', handles => [ 'add_rule' ], builder => sub { |
10 | DX::RuleSet->new |
11 | }); |
12 | |
13 | has facts => (is => 'ro', required => 1); |
14 | |
5ef4d923 |
15 | has observation_policy => (is => 'ro'); |
16 | |
b40e416a |
17 | sub query { |
18 | my ($self, $vars, @terms) = @_; |
19 | my $rule_set = $self->rule_set; |
71217e42 |
20 | push @terms, map +[ materialize => $_ ], @$vars; |
b40e416a |
21 | my $head = reduce { $b->but(next => $a) } |
22 | reverse map $rule_set->expand(@$_), @terms; |
23 | my $state = DX::State->new( |
24 | next_op => $head, |
25 | return_stack => [], |
26 | by_id => {}, |
27 | scope => {}, |
28 | last_choice => [], |
29 | facts => $self->facts, |
30 | rule_set => $rule_set, |
31 | )->assign_vars(map +($_ => {}), @$vars); |
32 | return DX::ResultStream->new( |
5ef4d923 |
33 | for_state => $state, |
34 | ($self->observation_policy |
35 | ? (observation_policy => $self->observation_policy) |
36 | : ()), |
b40e416a |
37 | ); |
38 | } |
39 | |
40 | 1; |