summaryrefslogtreecommitdiff
path: root/ext/psych/lib/psych
diff options
context:
space:
mode:
authortenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-01-21 19:11:53 +0000
committertenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-01-21 19:11:53 +0000
commit960720ef4fd9662d94bbc25d5a6cfcaa313450a3 (patch)
treec9cdafb9fb990ac2189e6c167f4c70c9b5d5c09f /ext/psych/lib/psych
parent5f710e22cc5d2d1ddab2d3a6abea5715b6b23b69 (diff)
* ext/psych/lib/psych/nodes/node.rb: Make Psych::Nodes::Node
enumerable. * ext/psych/lib/psych/visitors/depth_first.rb: Add a depth-first visitor to enumerate over a YAML AST in a depth-first fashion * test/psych/nodes/test_enumerable.rb: test for enumerating nodes * test/psych/visitors/test_depth_first.rb: test for depth-first visitor git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@30624 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/psych/lib/psych')
-rw-r--r--ext/psych/lib/psych/nodes/node.rb10
-rw-r--r--ext/psych/lib/psych/visitors.rb1
-rw-r--r--ext/psych/lib/psych/visitors/depth_first.rb26
3 files changed, 37 insertions, 0 deletions
diff --git a/ext/psych/lib/psych/nodes/node.rb b/ext/psych/lib/psych/nodes/node.rb
index bfd91f99ec..7c040ec463 100644
--- a/ext/psych/lib/psych/nodes/node.rb
+++ b/ext/psych/lib/psych/nodes/node.rb
@@ -6,6 +6,8 @@ module Psych
# The base class for any Node in a YAML parse tree. This class should
# never be instantiated.
class Node
+ include Enumerable
+
# The children of this node
attr_reader :children
@@ -18,6 +20,14 @@ module Psych
end
###
+ # Iterate over each node in the tree. Yields each node to +block+ depth
+ # first.
+ def each &block
+ return enum_for :each unless block_given?
+ Visitors::DepthFirst.new(block).accept self
+ end
+
+ ###
# Convert this node to Ruby.
#
# See also Psych::Visitors::ToRuby
diff --git a/ext/psych/lib/psych/visitors.rb b/ext/psych/lib/psych/visitors.rb
index 10ac4ce270..cc98b103f1 100644
--- a/ext/psych/lib/psych/visitors.rb
+++ b/ext/psych/lib/psych/visitors.rb
@@ -3,3 +3,4 @@ require 'psych/visitors/to_ruby'
require 'psych/visitors/emitter'
require 'psych/visitors/yaml_tree'
require 'psych/visitors/json_tree'
+require 'psych/visitors/depth_first'
diff --git a/ext/psych/lib/psych/visitors/depth_first.rb b/ext/psych/lib/psych/visitors/depth_first.rb
new file mode 100644
index 0000000000..c6eb814ac0
--- /dev/null
+++ b/ext/psych/lib/psych/visitors/depth_first.rb
@@ -0,0 +1,26 @@
+module Psych
+ module Visitors
+ class DepthFirst < Psych::Visitors::Visitor
+ def initialize block
+ @block = block
+ end
+
+ private
+
+ def nary o
+ o.children.each { |x| visit x }
+ @block.call o
+ end
+ alias :visit_Psych_Nodes_Stream :nary
+ alias :visit_Psych_Nodes_Document :nary
+ alias :visit_Psych_Nodes_Sequence :nary
+ alias :visit_Psych_Nodes_Mapping :nary
+
+ def terminal o
+ @block.call o
+ end
+ alias :visit_Psych_Nodes_Scalar :terminal
+ alias :visit_Psych_Nodes_Alias :terminal
+ end
+ end
+end