wheeeeeeeeee
[scpubgit/DKit.git] / lib / DX / Solver.pm
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
15 sub query {
16   my ($self, $vars, @terms) = @_;
17   my $rule_set = $self->rule_set;
18   my $head = reduce { $b->but(next => $a) }
19                reverse map $rule_set->expand(@$_), @terms;
20   my $state = DX::State->new(
21     next_op => $head,
22     return_stack => [],
23     by_id => {},
24     scope => {},
25     last_choice => [],
26     facts => $self->facts,
27     rule_set => $rule_set,
28   )->assign_vars(map +($_ => {}), @$vars);
29   return DX::ResultStream->new(
30     for_state => $state
31   );
32 }
33
34 1;