pass rspace to backtrack (as yet unused), tweak DependencyMap API
[scpubgit/DX.git] / lib / DX / ResolutionSpace.pm
CommitLineData
7f385fb2 1package DX::ResolutionSpace;
2
d69f4df4 3use DX::Step::Backtrack;
29daa554 4use DX::Step::ResolveProposition;
c99dbb05 5use DX::Utils qw(expand_deps);
7f385fb2 6use DX::Class;
7
22d29594 8has proposition => (is => 'ro', isa => Proposition);
0c1b8f3b 9
22d29594 10has geometry_depends_on => (is => 'ro', required => 1, isa => DependencyList);
7f385fb2 11
22d29594 12has aperture => (is => 'ro', required => 1, isa => ApertureList);
6aa36401 13
22d29594 14has members => (
15 is => 'ro', required => 1, isa => ArrayRef[ResolutionStrategy|Resolution]
16);
7f385fb2 17
6aa36401 18sub for_deparse {
19 my ($self) = @_;
20 [ statement => [
c99dbb05 21 [ symbol => 'resolution_space' ],
22 [ pairs => [
23 [ proposition => $self->proposition ],
24 [ geometry_depends_on => [ block => [
25 map [ statement => [
26 [ symbol => (split '::', ${$_->[0]})[-1] ],
27 [ value_path => [ @{$_}[1..$#$_] ] ],
28 ] ], @{expand_deps($self->geometry_depends_on)}
29 ] ] ],
30 (@{$self->aperture}
31 ? [ aperture => [ block => [
32 map [ statement => [
33 [ symbol => (split '::', ${$_->[0]})[-1] ],
34 [ value_path => [ @{$_}[1..$#$_] ] ],
35 ] ], @{$self->aperture}
36 ] ] ]
37 : ()),
38 [ members => [ block => [ @{$self->members} ] ] ]
39 ] ],
6aa36401 40 ] ];
41}
42
113f21b9 43sub next_resolution {
44 my ($self) = @_;
45 return undef unless my ($first) = @{$self->members};
46 return $first->next_resolution;
47}
48
49sub remaining_resolution_space {
50 my ($self) = @_;
51 die "Sense makes not" unless my ($first, @rest) = @{$self->members};
52 return $self->but(members => [ $first->remainder, @rest ]);
53}
54
0c1b8f3b 55sub next_step {
56 my ($self) = @_;
77bc0c6e 57 my $step_type = (@{$self->members} ? 'ResolveProposition' : 'Backtrack');
58 return "DX::Step::${step_type}"->new(resolution_space => $self);
0c1b8f3b 59}
60
7f385fb2 611;