rooted_tree 0.3.2 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/rooted_tree/node.rb +53 -5
- data/lib/rooted_tree/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2f48a3504fb307daf09d507cd556d7b622d6e17d
|
4
|
+
data.tar.gz: 363432cb0d5a2b69f0f4f0980de16ec03451619b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 08d262553a452128cceedda189e57d7118184f253c5106696a9a5b98751392091717dbd8551670cb81c6743e08ecd9876442c3592f4ff1e6ea9b67e9a581d5ee
|
7
|
+
data.tar.gz: f1de5a0b40607102934aaea8ecbb94d98de13aed5a5805bfed6e2ff34d41121a4cb600cc8a1f05dbf88b4c6001432c54e75621dde560ac4e79937cdd5f2a55f4
|
data/lib/rooted_tree/node.rb
CHANGED
@@ -31,10 +31,22 @@ module RootedTree
|
|
31
31
|
|
32
32
|
alias arity degree
|
33
33
|
|
34
|
+
# Creates a new node with the given object as its value, unless a Node is
|
35
|
+
# passed, in which case it will be returned.
|
36
|
+
#
|
37
|
+
# value - the object to be used as value for a new Node, or a Node object.
|
38
|
+
#
|
39
|
+
# Returns a Node object.
|
40
|
+
|
34
41
|
def self.[](value = nil)
|
35
42
|
return value if value.is_a? self
|
36
43
|
new value
|
37
44
|
end
|
45
|
+
|
46
|
+
# Create a new, unconnected Node object with an optional value. The value is
|
47
|
+
# owned by the Node instance and will be duped along with it.
|
48
|
+
#
|
49
|
+
# value - arbitrary object that is owned by the Node instance.
|
38
50
|
|
39
51
|
def initialize(value = nil)
|
40
52
|
@parent = nil
|
@@ -45,15 +57,33 @@ module RootedTree
|
|
45
57
|
@degree = 0
|
46
58
|
@value = value
|
47
59
|
end
|
60
|
+
|
61
|
+
# When copying a node the child nodes are copied as well, along with the
|
62
|
+
# value.
|
48
63
|
|
49
|
-
def
|
50
|
-
|
64
|
+
def initialize_dup(source)
|
65
|
+
# Dup each child and link them to the new parent
|
66
|
+
duped_children = source.children.map do |child|
|
67
|
+
child.dup.tap { |n| n.parent = self }
|
68
|
+
end
|
69
|
+
|
70
|
+
# Connect each child to its adjecent siblings
|
51
71
|
duped_children.each_cons(2) { |a, b| a.next, b.prev = b, a }
|
52
72
|
|
53
73
|
@parent = nil
|
54
74
|
@first_child = duped_children.first
|
55
75
|
@last_child = duped_children.last
|
76
|
+
@value = begin
|
77
|
+
source.value.dup
|
78
|
+
rescue TypeError
|
79
|
+
source.value
|
80
|
+
end
|
81
|
+
|
82
|
+
super
|
56
83
|
end
|
84
|
+
|
85
|
+
# Freezes the value as well as each of the children, outside of the normal
|
86
|
+
# behaviour.
|
57
87
|
|
58
88
|
def freeze
|
59
89
|
@value.freeze
|
@@ -135,12 +165,21 @@ module RootedTree
|
|
135
165
|
# Access the next sibling. Raises a StopIteration if this node is the last
|
136
166
|
# one.
|
137
167
|
#
|
138
|
-
# Returns the
|
168
|
+
# Returns the next sibling node.
|
139
169
|
|
140
170
|
def next
|
141
171
|
raise StopIteration if last?
|
142
172
|
@next
|
143
173
|
end
|
174
|
+
|
175
|
+
# Dangerous accessor of the next sibling. Unlike the regular #next this
|
176
|
+
# method will return nil if this node is the last one.
|
177
|
+
#
|
178
|
+
# Returns the next sibling node or nil if this node is last.
|
179
|
+
|
180
|
+
def next!
|
181
|
+
@next
|
182
|
+
end
|
144
183
|
|
145
184
|
# Access the previous sibling. Raises a StopIteration if this node is the
|
146
185
|
# first one.
|
@@ -153,6 +192,15 @@ module RootedTree
|
|
153
192
|
end
|
154
193
|
|
155
194
|
alias previous prev
|
195
|
+
|
196
|
+
# Dangerous accessor of the previous sibling. Unlike the regular #prev this
|
197
|
+
# method will return nil if this node is the first one.
|
198
|
+
|
199
|
+
def prev!
|
200
|
+
@prev
|
201
|
+
end
|
202
|
+
|
203
|
+
alias previous! prev!
|
156
204
|
|
157
205
|
# Access the parent node. Raises a StopIteration if this node is the
|
158
206
|
# root.
|
@@ -270,9 +318,9 @@ module RootedTree
|
|
270
318
|
# Returns an array of the children to the deleted node, now made roots.
|
271
319
|
|
272
320
|
def delete
|
273
|
-
extract.children.
|
321
|
+
extract.children.to_a.each do |child|
|
274
322
|
child.parent = nil
|
275
|
-
child
|
323
|
+
child.next = child.prev = nil
|
276
324
|
end
|
277
325
|
end
|
278
326
|
|
data/lib/rooted_tree/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rooted_tree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sebastian Lindberg
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|