format aperture in backtrack trace
[scpubgit/DX.git] / lib / DX / ResolutionSpace.pm
CommitLineData
7f385fb2 1package DX::ResolutionSpace;
2
d69f4df4 3use DX::Step::Backtrack;
29daa554 4use DX::Step::ResolveProposition;
3cc9323e 5use DX::Utils qw(compact_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..$#$_] ] ],
3cc9323e 28 ] ], @{$self->geometry_depends_on}
c99dbb05 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
3cc9323e 61sub with_geometry_dependencies {
62 my ($self, $deps) = @_;
63 my $new_deps = compact_deps([ @{$self->geometry_depends_on}, @$deps ]);
64 return $self->but(geometry_depends_on => $new_deps);
65}
66
7f385fb2 671;