add scan_dq_nodes helper
[dbsrgits/Data-Query.git] / lib / Data / Query / ExprHelpers.pm
index 809948e..399a8e2 100644 (file)
@@ -7,6 +7,7 @@ use base qw(Exporter);
 
 our @EXPORT = qw(
   perl_scalar_value perl_operator Literal Identifier compose intersperse
+  scan_dq_nodes
 );
 
 sub intersperse { my $i = shift; my @i = map +($_, $i), @_; pop @i; @i }
@@ -127,5 +128,17 @@ sub compose (&@) {
   $a;
 }
 
+sub scan_dq_nodes {
+  my ($cb_map, @queue) = @_;
+  while (my $node = shift @queue) {
+    if ($node->{type} and my $cb = $cb_map->{$node->{type}}) {
+      $cb->($node);
+    }
+    push @queue,
+      grep ref($_) eq 'HASH',
+        map +(ref($_) eq 'ARRAY' ? @$_ : $_),
+          @{$node}{grep !/\./, keys %$node};
+  }
+}
 
 1;