c2bfff6137138e6462e4a0ad22435feee12d805a
[scpubgit/DX.git] / lib / DX / ResolutionSpace.pm
1 package DX::ResolutionSpace;
2
3 use DX::Utils qw(step);
4 use DX::Step::Backtrack;
5 use DX::Class;
6
7 has proposition => (is => 'ro');
8
9 has geometry_depends_on => (is => 'ro', required => 1);
10
11 has members => (is => 'ro', required => 1);
12
13 sub next_resolution {
14   my ($self) = @_;
15   return undef unless my ($first) = @{$self->members};
16   return $first->next_resolution;
17 }
18
19 sub remaining_resolution_space {
20   my ($self) = @_;
21   die "Sense makes not" unless my ($first, @rest) = @{$self->members};
22   return $self->but(members => [ $first->remainder, @rest ]);
23 }
24
25 sub next_step {
26   my ($self) = @_;
27   return DX::Step::Backtrack->new unless @{$self->members};
28   return step(
29     resolves => $self->proposition,
30     resolution_space => $self,
31   );
32 }
33
34 1;