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