format aperture in backtrack trace
[scpubgit/DX.git] / lib / DX / ResolutionSpace.pm
index ab14c35..a3e82b5 100644 (file)
@@ -1,10 +1,44 @@
 package DX::ResolutionSpace;
 
+use DX::Step::Backtrack;
+use DX::Step::ResolveProposition;
+use DX::Utils qw(compact_deps);
 use DX::Class;
 
-has geometry_depends_on => (is => 'ro', required => 1);
+has proposition => (is => 'ro', isa => Proposition);
 
-has members => (is => 'ro', required => 1);
+has geometry_depends_on => (is => 'ro', required => 1, isa => DependencyList);
+
+has aperture => (is => 'ro', required => 1, isa => ApertureList);
+
+has members => (
+  is => 'ro', required => 1, isa => ArrayRef[ResolutionStrategy|Resolution]
+);
+
+sub for_deparse {
+  my ($self) = @_;
+  [ statement => [
+    [ symbol => 'resolution_space' ],
+    [ pairs => [
+      [ proposition => $self->proposition ],
+      [ geometry_depends_on => [ block => [
+        map [ statement => [
+          [ symbol => (split '::', ${$_->[0]})[-1] ],
+          [ value_path => [ @{$_}[1..$#$_] ] ],
+        ] ], @{$self->geometry_depends_on}
+      ] ] ],
+      (@{$self->aperture}
+        ? [ aperture => [ block => [
+            map [ statement => [
+              [ symbol => (split '::', ${$_->[0]})[-1] ],
+              [ value_path => [ @{$_}[1..$#$_] ] ],
+            ] ], @{$self->aperture}
+          ] ] ]
+        : ()),
+      [ members => [ block => [ @{$self->members} ] ] ]
+    ] ],
+  ] ];
+}
 
 sub next_resolution {
   my ($self) = @_;
@@ -18,4 +52,16 @@ sub remaining_resolution_space {
   return $self->but(members => [ $first->remainder, @rest ]);
 }
 
+sub next_step {
+  my ($self) = @_;
+  my $step_type = (@{$self->members} ? 'ResolveProposition' : 'Backtrack');
+  return "DX::Step::${step_type}"->new(resolution_space => $self);
+}
+
+sub with_geometry_dependencies {
+  my ($self, $deps) = @_;
+  my $new_deps = compact_deps([ @{$self->geometry_depends_on}, @$deps ]);
+  return $self->but(geometry_depends_on => $new_deps);
+}
+
 1;