allow value scalarref, refactor
[scpubgit/DKit.git] / lib / DX / Solver.pm
CommitLineData
b40e416a 1package DX::Solver;
2
3use DX::RuleSet;
4use DX::State;
5use DX::ResultStream;
6use List::Util qw(reduce);
7use Moo;
8
9has rule_set => (is => 'lazy', handles => [ 'add_rule' ], builder => sub {
10 DX::RuleSet->new
11});
12
13has facts => (is => 'ro', required => 1);
14
5ef4d923 15has observation_policy => (is => 'ro');
16
b40e416a 17sub 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
401;