Class: Stupidedi::Zipper::EditedCursor
- Inherits:
-
AbstractCursor
- Object
- AbstractCursor
- Stupidedi::Zipper::EditedCursor
- Defined in:
- lib/stupidedi/zipper/edited_cursor.rb
Instance Attribute Summary collapse
-
#node ⇒ Object
readonly
Returns the value of attribute node.
- #parent ⇒ AbstractCursor readonly
- #path ⇒ Hole readonly
Querying the Tree Location collapse
Traversing the Tree collapse
-
#first ⇒ AbstractCursor, EditedCursor
Navigate to the first (leftmost) sibling node.
-
#last ⇒ AbstractCursor, EditedCursor
Navigate to the last (rightmost) sibling node.
-
#next ⇒ AbstractCursor, EditedCursor
Navigate to the next (rightward) sibling node.
-
#prev ⇒ AbstractCursor, EditedCursor
Navigate to the previous (leftward) sibling node.
-
#up ⇒ AbstractCursor
Navigate to the parent node.
Editing the Tree collapse
-
#append(node) ⇒ AbstractCursor, EditedCursor
Navigate to the last (rightmost) sibling node.
-
#delete ⇒ AbstractCursor, EditedCursor
Navigate to the last (rightmost) sibling node.
-
#prepend(node) ⇒ AbstractCursor, EditedCursor
Navigate to the last (rightmost) sibling node.
-
#replace(node) ⇒ AbstractCursor, EditedCursor
Navigate to the last (rightmost) sibling node.
Instance Method Summary collapse
-
#initialize(node, path, parent) ⇒ EditedCursor
constructor
A new instance of EditedCursor.
Methods inherited from AbstractCursor
#append_child, #between, #child, #children, #dangle, #depth, #descendant, #down, #first?, #flatten, #insert_left, #insert_right, #last?, #prepend_child, #root
Constructor Details
#initialize(node, path, parent) ⇒ EditedCursor
Returns a new instance of EditedCursor.
15 16 17 18 |
# File 'lib/stupidedi/zipper/edited_cursor.rb', line 15 def initialize(node, path, parent) @node, @path, @parent = node, path, parent end |
Instance Attribute Details
#node ⇒ Object (readonly)
Returns the value of attribute node.
7 8 9 |
# File 'lib/stupidedi/zipper/edited_cursor.rb', line 7 def node @node end |
#parent ⇒ AbstractCursor (readonly)
13 14 15 |
# File 'lib/stupidedi/zipper/edited_cursor.rb', line 13 def parent @parent end |
#path ⇒ Hole (readonly)
10 11 12 |
# File 'lib/stupidedi/zipper/edited_cursor.rb', line 10 def path @path end |
Instance Method Details
#append(node) ⇒ AbstractCursor, EditedCursor
Navigate to the last (rightmost) sibling node
109 110 111 112 |
# File 'lib/stupidedi/zipper/edited_cursor.rb', line 109 def append(node) EditedCursor.new(node, Hole.new(@node.cons(@path.left), @path.parent, @path.right), @parent) end |
#delete ⇒ AbstractCursor, EditedCursor
Navigate to the last (rightmost) sibling node
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
# File 'lib/stupidedi/zipper/edited_cursor.rb', line 129 def delete if not last? # Move to `next` head, *tail = @path.right EditedCursor.new(head, Hole.new(@path.left, @path.parent, tail), @parent) elsif not first? # Move to `prev` head, *tail = @path.left EditedCursor.new(head, Hole.new(tail, @path.parent, @path.right), @parent) else # Deleting the only child parent = @parent.node.copy(:children => @path.left.reverse.concat(@path.right)) EditedCursor.new(parent, @path.parent, @parent.parent).dangle end end |
#first ⇒ AbstractCursor, EditedCursor
Navigate to the first (leftmost) sibling node
80 81 82 83 84 85 86 87 88 89 |
# File 'lib/stupidedi/zipper/edited_cursor.rb', line 80 def first if first? return self end right = @path.left.init.reverse.concat(@node.cons(@path.right)) EditedCursor.new(@path.left.last, Hole.new([], @path.parent, right), @parent) end |
#last ⇒ AbstractCursor, EditedCursor
Navigate to the last (rightmost) sibling node
93 94 95 96 97 98 99 100 101 102 |
# File 'lib/stupidedi/zipper/edited_cursor.rb', line 93 def last if last? return self end left = @node.cons(@path.right.init.reverse).concat(@path.left) EditedCursor.new(@path.right.last, Hole.new(left, @path.parent, []), @parent) end |
#leaf? ⇒ Boolean
24 25 26 |
# File 'lib/stupidedi/zipper/edited_cursor.rb', line 24 def leaf? @node.leaf? or @node.children.empty? end |
#next ⇒ AbstractCursor, EditedCursor
Navigate to the next (rightward) sibling node
52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/stupidedi/zipper/edited_cursor.rb', line 52 def next if last? raise Exceptions::ZipperError, "cannot move to next after last node" end head, *tail = @path.right EditedCursor.new(head, Hole.new(@node.cons(@path.left), @path.parent, tail), @parent) end |
#prepend(node) ⇒ AbstractCursor, EditedCursor
Navigate to the last (rightmost) sibling node
116 117 118 119 |
# File 'lib/stupidedi/zipper/edited_cursor.rb', line 116 def prepend(node) EditedCursor.new(node, Hole.new(@path.left, @path.parent, @node.cons(@path.right)), @parent) end |
#prev ⇒ AbstractCursor, EditedCursor
Navigate to the previous (leftward) sibling node
66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/stupidedi/zipper/edited_cursor.rb', line 66 def prev if first? raise Exceptions::ZipperError, "cannot move to prev before first node" end head, *tail = @path.left EditedCursor.new(head, Hole.new(tail, @path.parent, @node.cons(@path.right)), @parent) end |
#replace(node) ⇒ AbstractCursor, EditedCursor
Navigate to the last (rightmost) sibling node
123 124 125 |
# File 'lib/stupidedi/zipper/edited_cursor.rb', line 123 def replace(node) EditedCursor.new(node, @path, @parent) end |
#root? ⇒ Boolean
29 30 31 |
# File 'lib/stupidedi/zipper/edited_cursor.rb', line 29 def root? false end |
#up ⇒ AbstractCursor
Navigate to the parent node
38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/stupidedi/zipper/edited_cursor.rb', line 38 def up node = @parent.node.copy(:children => @path.left.reverse.concat(@node.cons(@path.right))) if parent.root? RootCursor.new(node) else EditedCursor.new(node, @path.parent, @parent.parent) end end |