module Riml::Walkable

Public Instance Methods

child_after(node) click to toggle source
# File lib/riml/walkable.rb, line 44
def child_after(node)
  node.next
end
child_previous_to(node) click to toggle source
# File lib/riml/walkable.rb, line 22
def child_previous_to(node)
  node.previous
end
each(&block) click to toggle source
# File lib/riml/walkable.rb, line 5
def each(&block)
  children.each(&block)
end
Also aliased as: walk
index_by_children() click to toggle source
# File lib/riml/walkable.rb, line 64
def index_by_children
  parent.children.find_index(self)
end
index_by_member() click to toggle source
# File lib/riml/walkable.rb, line 54
def index_by_member
  attrs = parent.members
  attrs.each_with_index do |attr, i|
    if parent.send(attr) == self
      return i
    end
  end
  nil
end
insert_after(node, new_node) click to toggle source
# File lib/riml/walkable.rb, line 48
def insert_after(node, new_node)
  idx = children.find_index(node)
  return unless idx
  children.insert(idx + 1, new_node)
end
insert_before(node, new_node) click to toggle source
# File lib/riml/walkable.rb, line 26
def insert_before(node, new_node)
  idx = children.find_index(node)
  return unless idx
  children.insert(idx - 1, new_node)
end
next() click to toggle source
# File lib/riml/walkable.rb, line 32
def next
  idx = index_by_member
  if idx && parent.members[idx + 1]
    attr = parent.members[idx + 1]
    return parent.send(attr)
  else
    idx = index_by_children
    return unless idx
    parent.children.fetch(idx + 1)
  end
end
previous() click to toggle source
# File lib/riml/walkable.rb, line 10
def previous
  idx = index_by_member
  if idx && parent.members[idx - 1]
    attr = parent.members[idx - 1]
    return send(attr)
  else
    idx = index_by_children
    return unless idx
    parent.children.fetch(idx - 1)
  end
end
remove() click to toggle source
# File lib/riml/walkable.rb, line 68
def remove
  idx = index_by_member
  if idx
    attr = parent.members[idx]
    parent.send("#{attr}=", nil)
  else
    idx = index_by_children
    parent.children.slice!(idx) if idx
  end
end
replace_with(new_node) click to toggle source
# File lib/riml/walkable.rb, line 79
def replace_with(new_node)
  idx = index_by_member
  if idx
    attr = parent.members[idx]
    new_node.parent = parent
    parent.send("#{attr}=", new_node)
    new_node
  else
    idx = index_by_children
    return unless idx
    new_node.parent = parent
    parent.children.insert(idx, new_node)
    parent.children.slice!(idx + 1)
    new_node
  end
end
walk(&block)
Alias for: each