Class: Async::List
- Inherits:
-
Object
- Object
- Async::List
- Defined in:
- lib/async/list.rb
Overview
Direct Known Subclasses
Defined Under Namespace
Classes: Node
Instance Attribute Summary collapse
-
#head ⇒ Object
Returns the value of attribute head.
-
#size ⇒ Object
readonly
Returns the value of attribute size.
-
#tail ⇒ Object
Returns the value of attribute tail.
- #The number of nodes in the list.(numberofnodes) ⇒ Object readonly
Instance Method Summary collapse
-
#added(node) ⇒ Object
A callback that is invoked when an item is added to the list.
-
#append(node) ⇒ Object
Append a node to the end of the list.
-
#each(&block) ⇒ Object
Iterate over each node in the linked list.
- #empty? ⇒ Boolean
- #first ⇒ Object
-
#include?(needle) ⇒ Boolean
Determine whether the given node is included in the list.
-
#initialize ⇒ List
constructor
Initialize a new, empty, list.
- #last ⇒ Object
- #Points at the end of the list.=(attheend) ⇒ Object
- #Points at the start of the list.=(atthestartofthelist. = (value)) ⇒ Object
-
#prepend(node) ⇒ Object
Prepend a node to the start of the list.
-
#remove(node) ⇒ Object
Remove the node.
-
#remove?(node) ⇒ Boolean
Remove the node if it is in a list.
-
#removed(node) ⇒ Object
A callback that is invoked when an item is removed from the list.
-
#shift ⇒ Object
Shift the first node off the list, if it is not empty.
-
#stack(node, &block) ⇒ Object
Add the node, yield, and the remove the node.
-
#to_a ⇒ Object
Fast, safe, unbounded accumulation of children.
- #to_s ⇒ Object (also: #inspect)
Constructor Details
#initialize ⇒ List
Initialize a new, empty, list.
10 11 12 13 14 |
# File 'lib/async/list.rb', line 10 def initialize @head = self @tail = self @size = 0 end |
Instance Attribute Details
#head ⇒ Object
Returns the value of attribute head.
40 41 42 |
# File 'lib/async/list.rb', line 40 def head @head end |
#size ⇒ Object (readonly)
Returns the value of attribute size.
46 47 48 |
# File 'lib/async/list.rb', line 46 def size @size end |
#tail ⇒ Object
Returns the value of attribute tail.
43 44 45 |
# File 'lib/async/list.rb', line 43 def tail @tail end |
#The number of nodes in the list.(numberofnodes) ⇒ Object (readonly)
46 |
# File 'lib/async/list.rb', line 46 attr :size |
Instance Method Details
#added(node) ⇒ Object
A callback that is invoked when an item is added to the list.
49 50 51 52 |
# File 'lib/async/list.rb', line 49 def added(node) @size += 1 return node end |
#append(node) ⇒ Object
Append a node to the end of the list.
55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/async/list.rb', line 55 def append(node) if node.head raise ArgumentError, "Node is already in a list!" end node.tail = self @head.tail = node node.head = @head @head = node return added(node) end |
#each(&block) ⇒ Object
Iterate over each node in the linked list. It is generally safe to remove the current node, any previous node or any future node during iteration.
175 176 177 178 179 180 181 |
# File 'lib/async/list.rb', line 175 def each(&block) return to_enum unless block_given? Iterator.each(self, &block) return self end |
#empty? ⇒ Boolean
138 139 140 |
# File 'lib/async/list.rb', line 138 def empty? @size == 0 end |
#first ⇒ Object
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
# File 'lib/async/list.rb', line 196 def first # validate! current = @tail while !current.equal?(self) if current.is_a?(Iterator) current = current.tail else return current end end return nil end |
#include?(needle) ⇒ Boolean
Determine whether the given node is included in the list.
187 188 189 190 191 192 193 |
# File 'lib/async/list.rb', line 187 def include?(needle) self.each do |item| return true if needle.equal?(item) end return false end |
#last ⇒ Object
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 |
# File 'lib/async/list.rb', line 213 def last # validate! current = @head while !current.equal?(self) if current.is_a?(Iterator) current = current.head else return current end end return nil end |
#Points at the end of the list.=(attheend) ⇒ Object
40 |
# File 'lib/async/list.rb', line 40 attr_accessor :head |
#Points at the start of the list.=(atthestartofthelist. = (value)) ⇒ Object
43 |
# File 'lib/async/list.rb', line 43 attr_accessor :tail |
#prepend(node) ⇒ Object
Prepend a node to the start of the list.
69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/async/list.rb', line 69 def prepend(node) if node.head raise ArgumentError, "Node is already in a list!" end node.head = self @tail.head = node node.tail = @tail @tail = node return added(node) end |
#remove(node) ⇒ Object
Remove the node. If it was already removed, this will raise an error.
You should be careful to only remove nodes that are part of this list.
117 118 119 120 121 122 123 124 |
# File 'lib/async/list.rb', line 117 def remove(node) # One downside of this interface is we don't actually check if the node is part of the list defined by `self`. This means that there is a potential for a node to be removed from a different list using this method, which in can throw off book-keeping when lists track size, etc. unless node.head raise ArgumentError, "Node is not in a list!" end remove!(node) end |
#remove?(node) ⇒ Boolean
Remove the node if it is in a list.
You should be careful to only remove nodes that are part of this list.
103 104 105 106 107 108 109 |
# File 'lib/async/list.rb', line 103 def remove?(node) if node.head return remove!(node) end return nil end |
#removed(node) ⇒ Object
A callback that is invoked when an item is removed from the list.
93 94 95 96 |
# File 'lib/async/list.rb', line 93 def removed(node) @size -= 1 return node end |
#shift ⇒ Object
Shift the first node off the list, if it is not empty.
230 231 232 233 234 |
# File 'lib/async/list.rb', line 230 def shift if node = first remove!(node) end end |
#stack(node, &block) ⇒ Object
Add the node, yield, and the remove the node.
85 86 87 88 89 90 |
# File 'lib/async/list.rb', line 85 def stack(node, &block) append(node) return yield(node) ensure remove!(node) end |
#to_a ⇒ Object
Fast, safe, unbounded accumulation of children.
24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/async/list.rb', line 24 def to_a items = [] current = self while current.tail != self unless current.tail.is_a?(Iterator) items << current.tail end current = current.tail end return items end |
#to_s ⇒ Object Also known as: inspect
17 18 19 |
# File 'lib/async/list.rb', line 17 def to_s sprintf("#<%s:0x%x size=%d>", self.class.name, object_id, @size) end |