Method: HTree::Node#subst_internal

Defined in:
lib/htree/loc.rb

#subst_internal(pairs) ⇒ Object

:nodoc:



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/htree/loc.rb', line 62

def subst_internal(pairs) # :nodoc:
  subnode_pairs = {}
  pairs.each {|key, val|
    k = key.pop
    (subnode_pairs[k] ||= []) << [key, val]
  }
  subnode_pairs = subnode_pairs.map {|k, subpairs|
    s = get_subnode(k)
    subpairs_empty_key, subpairs_nonempty_key =
      subpairs.partition {|key, val| key.empty? }
    if !subpairs_empty_key.empty?
      if !subpairs_nonempty_key.empty?
        raise ArgumentError, "cannot substitute a node under substituting tree."
      end
      r = []
      subpairs_empty_key.each {|key, val| r.concat val }
      [k, r.compact]
    elsif subpairs_nonempty_key.empty?
      [k, s]
    else
      [k, s.subst_internal(subpairs)]
    end
  }
  subst_subnode(subnode_pairs)
end