sma backtracking (smart will be later ;)
[scpubgit/DX.git] / lib / DX / Step / Backtrack.pm
index 06d1986..df74d92 100644 (file)
@@ -1,7 +1,7 @@
 package DX::Step::Backtrack;
 
 use DX::DependencyMap;
-use DX::Utils qw(format_deps);
+use DX::Utils qw(format_deps compact_deps);
 use DX::Class;
 
 with 'DX::Role::Step';
@@ -13,31 +13,59 @@ sub apply_to {
   my $rspace = $self->resolution_space;
   trace backtrack => [ statement => [
     [ symbol => 'backtrack' ],
-    [ statement => [
-      [ symbol => 'because' ],
-      format_deps($rspace->geometry_depends_on)
-    ] ]
+    [ 'enter_block' ]
+  ] ];
+  trace backtrack => [ statement => [
+    [ symbol => 'failure_dependencies' ],
+    format_deps($rspace->geometry_depends_on)
   ] ];
   my $dmap = DX::DependencyMap->new_empty
                               ->with_dependencies_for(
                                   backtrack => $rspace->geometry_depends_on
                                 );
-
-  foreach my $adj (@{$ss->decisions_taken}) {
+  DECISION: foreach my $adj (@{$ss->decisions_taken}) {
     my ($rspace_was, $ss_was) = @$adj;
-    $dmap = $dmap->with_dependencies_for(
-      backtrack => $rspace_was->geometry_depends_on
-    );
-    next unless @{$rspace_was->remaining_resolution_space->members};
-    trace rspace => [ statement => [
-      [ symbol => 'remaining' ],
-      @{$rspace_was->remaining_resolution_space->for_deparse->[1]}
+    trace backtrack => [ statement => [
+      [ symbol => 'decision' ],
+      [ pairs => [
+        [ for => $rspace_was->proposition, ]
+          #aperture => 
+      ] ]
     ] ];
-    return $ss_was->but(
-      next_step => $rspace_was->remaining_resolution_space->next_step
-    );
+    foreach my $event (@{$rspace_was->aperture}) {
+      if ($dmap->dependents_of($event)) {
+        my $remain = $rspace_was->remaining_resolution_space;
+        if (@{$remain->members}) {
+          trace backtrack => [ statement => [
+            [ symbol => 'found_alternative' ]
+          ] ];
+          trace backtrack => [ 'leave_block' ];
+          return $ss_was->but(
+            next_step => $remain->with_geometry_dependencies(
+                                  $dmap->dependencies_for('backtrack')
+                               )->next_step
+          );
+        }
+        $dmap = $dmap->with_dependencies_for(
+          backtrack => $rspace_was->geometry_depends_on
+        );
+        trace backtrack => [ statement => [
+          [ symbol => 'failure_dependencies' ],
+          format_deps(compact_deps($dmap->dependencies_for('backtrack')))
+        ] ];
+        next DECISION;
+      }
+    }
+    trace backtrack => [ statement => [ [ symbol => 'non_relevant' ] ] ];
   }
-  return $ss->but(next_step => $ss->on_exhaustion_step);
+  trace backtrack => [ statement => [ [ symbol => 'exhaustion' ] ] ];
+  trace backtrack => [ 'leave_block' ];
+  return $ss->but(
+    next_step
+      => $ss->on_exhaustion_step->but(
+           exhaustion_depends_on => $dmap->dependencies_for('backtrack')
+         )
+  );
 }
 
 1;