Class: Stupidedi::Zipper::MemoizedCursor

Inherits:
AbstractCursor show all
Defined in:
lib/stupidedi/zipper/memoized_cursor.rb

Instance Attribute Summary collapse

Querying the Tree Location collapse

Traversing the Tree collapse

Editing the Tree collapse

Instance Method Summary collapse

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) ⇒ MemoizedCursor

Returns a new instance of MemoizedCursor.



18
19
20
21
# File 'lib/stupidedi/zipper/memoized_cursor.rb', line 18

def initialize(node, path, parent)
  @node, @path, @parent =
    node, path, parent
end

Instance Attribute Details

#node#leaf?, ... (readonly)

Returns:



9
10
11
# File 'lib/stupidedi/zipper/memoized_cursor.rb', line 9

def node
  @node
end

#parentAbstractCursor (readonly)

Returns:



16
17
18
# File 'lib/stupidedi/zipper/memoized_cursor.rb', line 16

def parent
  @parent
end

#pathHole (readonly)

Returns:



12
13
14
# File 'lib/stupidedi/zipper/memoized_cursor.rb', line 12

def path
  @path
end

Instance Method Details

#append(node) ⇒ EditedCursor

Returns:



88
89
90
91
# File 'lib/stupidedi/zipper/memoized_cursor.rb', line 88

def append(node)
  EditedCursor.new(node,
    Hole.new(@node.cons(@path.left), @path.parent, @path.right), @parent)
end

#deleteEditedCursor

Returns:



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/stupidedi/zipper/memoized_cursor.rb', line 105

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

#firstMemoizedCursor

Returns:



73
74
75
# File 'lib/stupidedi/zipper/memoized_cursor.rb', line 73

def first
  @parent.down
end

#lastMemoizedCursor

Returns:



78
79
80
81
82
# File 'lib/stupidedi/zipper/memoized_cursor.rb', line 78

def last
  current = self
  current = current.next until current.last?
  current
end

#leaf?Boolean

Returns:

  • (Boolean)


26
27
28
# File 'lib/stupidedi/zipper/memoized_cursor.rb', line 26

def leaf?
  @node.leaf? or @node.children.empty?
end

#nextMemoizedCursor

Returns:



43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/stupidedi/zipper/memoized_cursor.rb', line 43

def next
  @__next ||= begin
    if last?
      raise Exceptions::ZipperError,
        "cannot move to next after last node"
    end

    head, *tail = @path.right

    MemoizedCursor.new(head,
      Hole.new(@node.cons(@path.left), @path.parent, tail), @parent)
  end
end

#prependEditedCursor

Returns:



94
95
96
97
# File 'lib/stupidedi/zipper/memoized_cursor.rb', line 94

def prepend
  EditedCursor.new(node,
    Hole.new(@path.left, @path.parent, @node.cons(@path.right)), @parent)
end

#prevMemoizedCursor

Returns:



58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/stupidedi/zipper/memoized_cursor.rb', line 58

def prev
  @__prev ||= begin
    if first?
      raise Exceptions::ZipperError,
        "cannot move to prev before first node"
    end

    head, *tail = @path.left

    MemoizedCursor.new(head,
      Hole.new(tail, @path.parent, @node.cons(@path.right)), @parent)
  end
end

#replace(node) ⇒ EditedCursor

Returns:



100
101
102
# File 'lib/stupidedi/zipper/memoized_cursor.rb', line 100

def replace(node)
  EditedCursor.new(node, @path, @parent)
end

#root?Boolean

Returns:

  • (Boolean)


30
31
32
# File 'lib/stupidedi/zipper/memoized_cursor.rb', line 30

def root?
  false
end

#upAbstractCursor

Returns:



38
39
40
# File 'lib/stupidedi/zipper/memoized_cursor.rb', line 38

def up
  @parent
end