Commit | Line | Data |
7f385fb2 |
1 | package DX::ResolutionSpace; |
2 | |
d69f4df4 |
3 | use DX::Step::Backtrack; |
29daa554 |
4 | use DX::Step::ResolveProposition; |
c99dbb05 |
5 | use DX::Utils qw(expand_deps); |
7f385fb2 |
6 | use DX::Class; |
7 | |
22d29594 |
8 | has proposition => (is => 'ro', isa => Proposition); |
0c1b8f3b |
9 | |
22d29594 |
10 | has geometry_depends_on => (is => 'ro', required => 1, isa => DependencyList); |
7f385fb2 |
11 | |
22d29594 |
12 | has aperture => (is => 'ro', required => 1, isa => ApertureList); |
6aa36401 |
13 | |
22d29594 |
14 | has members => ( |
15 | is => 'ro', required => 1, isa => ArrayRef[ResolutionStrategy|Resolution] |
16 | ); |
7f385fb2 |
17 | |
6aa36401 |
18 | sub 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 |
43 | sub next_resolution { |
44 | my ($self) = @_; |
45 | return undef unless my ($first) = @{$self->members}; |
46 | return $first->next_resolution; |
47 | } |
48 | |
49 | sub 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 |
55 | sub 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 |
61 | 1; |