diff options
author | tenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-01-21 19:11:53 +0000 |
---|---|---|
committer | tenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-01-21 19:11:53 +0000 |
commit | 960720ef4fd9662d94bbc25d5a6cfcaa313450a3 (patch) | |
tree | c9cdafb9fb990ac2189e6c167f4c70c9b5d5c09f /ext | |
parent | 5f710e22cc5d2d1ddab2d3a6abea5715b6b23b69 (diff) | |
download | ruby-960720ef4fd9662d94bbc25d5a6cfcaa313450a3.tar.gz |
* 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')
-rw-r--r-- | ext/psych/lib/psych/nodes/node.rb | 10 | ||||
-rw-r--r-- | ext/psych/lib/psych/visitors.rb | 1 | ||||
-rw-r--r-- | ext/psych/lib/psych/visitors/depth_first.rb | 26 |
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 |