1 package DX::ResolutionSpace;
3 use DX::Step::Backtrack;
4 use DX::Step::ResolveProposition;
5 use DX::Utils qw(expand_deps);
8 has proposition => (is => 'ro');
10 has geometry_depends_on => (is => 'ro', required => 1);
12 has aperture => (is => 'ro', required => 1);
14 has members => (is => 'ro', required => 1);
19 [ symbol => 'resolution_space' ],
21 [ proposition => $self->proposition ],
22 [ geometry_depends_on => [ block => [
24 [ symbol => (split '::', ${$_->[0]})[-1] ],
25 [ value_path => [ @{$_}[1..$#$_] ] ],
26 ] ], @{expand_deps($self->geometry_depends_on)}
29 ? [ aperture => [ block => [
31 [ symbol => (split '::', ${$_->[0]})[-1] ],
32 [ value_path => [ @{$_}[1..$#$_] ] ],
33 ] ], @{$self->aperture}
36 [ members => [ block => [ @{$self->members} ] ] ]
43 return undef unless my ($first) = @{$self->members};
44 return $first->next_resolution;
47 sub remaining_resolution_space {
49 die "Sense makes not" unless my ($first, @rest) = @{$self->members};
50 return $self->but(members => [ $first->remainder, @rest ]);
55 return DX::Step::Backtrack->new unless @{$self->members};
56 return DX::Step::ResolveProposition->new(resolution_space => $self);