skn_utils 3.3.8 → 3.3.9
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/bin/bench_linklists.rb +28 -8
- data/lib/skn_utils/lists/circular_linked_list.rb +15 -14
- data/lib/skn_utils/lists/doubly_linked_list.rb +10 -11
- data/lib/skn_utils/lists/link_node.rb +20 -14
- data/lib/skn_utils/lists/linked_commons.rb +15 -25
- data/lib/skn_utils/lists/linked_list.rb +12 -4
- data/lib/skn_utils/version.rb +1 -1
- data/spec/lib/skn_utils/lists/node_based_linked_list_spec.rb +2 -1
- data/spec/support/shared_examples_for_linked_list.rb +6 -6
- 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: a858152ce4dbee2e8d75935809054ce1794e4865
|
4
|
+
data.tar.gz: 81d7e5210977626a919d06b9f43dee354f44e85c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 31c5cfda536c02ac7a783fc7f9bf45d1bb0f098b5acee96a30ec4312a0121151de5e6886d6d70f0df337f3a09603c634c9fe2ffb11b4283530d3b0c0013dd1a9
|
7
|
+
data.tar.gz: fe52c36f44ad71a09e9d5ea5aac0e973f9c6eabf2b15d7f0b19a98495a5933b8ecba476c172a6646cf33f85378b918ee0ccfe2084be04b9393b724bd139c4222
|
data/bin/bench_linklists.rb
CHANGED
@@ -54,20 +54,40 @@ Benchmark.ips do |x|
|
|
54
54
|
vargs = [70, 71, 72, 73, 74, 75, 76, 77, 78, 79]
|
55
55
|
cproc = lambda {|a| a}
|
56
56
|
|
57
|
-
x.report('
|
57
|
+
x.report('Array Ops') do
|
58
|
+
ary = Array.new(vargs)
|
59
|
+
# adders.each {|x| ary.push(x) }
|
60
|
+
adders.each {|x| ary.insert(5, x) }
|
61
|
+
value = ary.sort!
|
62
|
+
ary.first
|
63
|
+
ary.clear
|
64
|
+
end
|
65
|
+
|
66
|
+
x.report('Single Ops') do
|
58
67
|
ll = SknUtils::Lists::LinkedList.new(*vargs, &cproc)
|
59
|
-
adders.each {|x| ll.
|
68
|
+
# adders.each {|x| ll.insert(x) }
|
69
|
+
adders.each {|x| ll.insert_after(74, x) }
|
60
70
|
value = ll.sort!
|
61
71
|
ll.first
|
62
72
|
ll.clear
|
63
73
|
end
|
64
74
|
|
65
|
-
x.report('
|
66
|
-
|
67
|
-
adders.each {|x|
|
68
|
-
|
69
|
-
|
70
|
-
|
75
|
+
x.report('Double Ops') do
|
76
|
+
dll = SknUtils::Lists::DoublyLinkedList.new(*vargs, &cproc)
|
77
|
+
# adders.each {|x| dll.insert(x) }
|
78
|
+
adders.each {|x| dll.insert_after(74, x) }
|
79
|
+
value = dll.sort!
|
80
|
+
dll.first
|
81
|
+
dll.clear
|
82
|
+
end
|
83
|
+
|
84
|
+
x.report('Circulat Ops') do
|
85
|
+
cl = SknUtils::Lists::CircularLinkedList.new(*vargs, &cproc)
|
86
|
+
# adders.each {|x| cl.insert(x) }
|
87
|
+
adders.each {|x| cl.insert_after(74, x) }
|
88
|
+
value = cl.sort!
|
89
|
+
cl.first
|
90
|
+
cl.clear
|
71
91
|
end
|
72
92
|
|
73
93
|
x.compare!
|
@@ -70,6 +70,21 @@ module SknUtils
|
|
70
70
|
#
|
71
71
|
# Modifications
|
72
72
|
#
|
73
|
+
# return new size
|
74
|
+
def insert(value)
|
75
|
+
node = @current
|
76
|
+
@current = LinkNode.new(value, node, :circle_after, self, &@match_value)
|
77
|
+
if self.size == 0 # only
|
78
|
+
self.head = @current
|
79
|
+
self.tail = @current
|
80
|
+
elsif self.tail == node
|
81
|
+
self.tail = @current
|
82
|
+
@current.next = self.head
|
83
|
+
self.head.prev = @current
|
84
|
+
end
|
85
|
+
self.size += 1
|
86
|
+
end
|
87
|
+
alias_method :append, :insert
|
73
88
|
|
74
89
|
# return new size
|
75
90
|
def insert_before(position_value, value)
|
@@ -131,22 +146,8 @@ module SknUtils
|
|
131
146
|
end
|
132
147
|
end
|
133
148
|
|
134
|
-
|
135
149
|
protected
|
136
150
|
|
137
|
-
def find_by_value(value)
|
138
|
-
return nil if value.nil? || self.size == 0
|
139
|
-
stop_node = self.head
|
140
|
-
target = stop_node
|
141
|
-
rtn_node = nil
|
142
|
-
while !target.match_by_value(value)
|
143
|
-
target = target.next
|
144
|
-
break if stop_node.equal?(target)
|
145
|
-
end
|
146
|
-
target = nil unless target.match_by_value(value)
|
147
|
-
target
|
148
|
-
end
|
149
|
-
|
150
151
|
def find_by_index(index)
|
151
152
|
return nil if ( index > self.size || index < 1 )
|
152
153
|
node = self.head
|
@@ -68,6 +68,16 @@ module SknUtils
|
|
68
68
|
# Modifications
|
69
69
|
#
|
70
70
|
|
71
|
+
# return new size
|
72
|
+
def insert(value)
|
73
|
+
node = @current
|
74
|
+
@current = LinkNode.new(value, node, :after, self, &@match_value)
|
75
|
+
self.head = @current if self.head.nil?
|
76
|
+
self.tail = @current if self.tail.equal?(node)
|
77
|
+
self.size += 1
|
78
|
+
end
|
79
|
+
alias_method :append, :insert
|
80
|
+
|
71
81
|
# return new size
|
72
82
|
def insert_before(position_value, value)
|
73
83
|
target = find_by_value(position_value)
|
@@ -116,17 +126,6 @@ module SknUtils
|
|
116
126
|
|
117
127
|
protected
|
118
128
|
|
119
|
-
def find_by_value(value)
|
120
|
-
return nil if self.head.nil? || value.nil? || self.size == 0
|
121
|
-
prior = self.head
|
122
|
-
target = prior
|
123
|
-
while target and not target.match_by_value(value)
|
124
|
-
prior = target
|
125
|
-
target = prior.next
|
126
|
-
end
|
127
|
-
target
|
128
|
-
end
|
129
|
-
|
130
129
|
def find_by_index(index)
|
131
130
|
return nil if self.head.nil? or index < 1 or index > self.size
|
132
131
|
node = self.head
|
@@ -10,6 +10,10 @@ module SknUtils
|
|
10
10
|
|
11
11
|
attr_accessor :prev, :next, :value
|
12
12
|
|
13
|
+
def self.call(val, anchor_node=nil, strategy=:after, mgr=nil, &cmp_key)
|
14
|
+
self.new(val, anchor_node, strategy, mgr, &cmp_key)
|
15
|
+
end
|
16
|
+
|
13
17
|
def initialize(val, anchor_node=nil, strategy=:after, mgr=nil, &cmp_key)
|
14
18
|
@value = val
|
15
19
|
@prev = nil
|
@@ -43,7 +47,7 @@ module SknUtils
|
|
43
47
|
end
|
44
48
|
|
45
49
|
def match_by_value(other_value)
|
46
|
-
@cmp_proc.call(self.value)
|
50
|
+
@cmp_proc.call(self.value) == @cmp_proc.call(other_value)
|
47
51
|
end
|
48
52
|
|
49
53
|
# Returns
|
@@ -77,7 +81,7 @@ module SknUtils
|
|
77
81
|
|
78
82
|
# Reverse API to Parent Linked List Class
|
79
83
|
def node_value
|
80
|
-
|
84
|
+
node_value_request(:current)
|
81
85
|
end
|
82
86
|
def first_node
|
83
87
|
node_request(:first)
|
@@ -95,20 +99,22 @@ module SknUtils
|
|
95
99
|
node_request(:last)
|
96
100
|
end
|
97
101
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
+
# Retrieves requested node, not value
|
103
|
+
def node_request(method_sym=:current, *vargs, &block)
|
104
|
+
block_given? ? @provider.send(method_sym, *vargs, &block) :
|
105
|
+
(vargs.size == 0 ? @provider.send(method_sym) : @provider.send(method_sym, *vargs))
|
106
|
+
@provider.instance_variable_get(:@current)
|
107
|
+
rescue
|
108
|
+
nil
|
102
109
|
end
|
103
|
-
|
104
|
-
def
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
super
|
110
|
-
end
|
110
|
+
# Retrieves requested value, not node
|
111
|
+
def node_value_request(method_sym=:current, *vargs, &block)
|
112
|
+
position_value = block_given? ? @provider.send(method_sym, *vargs, &block) :
|
113
|
+
(vargs.size == 0 ? @provider.send(method_sym) : @provider.send(method_sym, *vargs))
|
114
|
+
rescue
|
115
|
+
nil
|
111
116
|
end
|
117
|
+
|
112
118
|
end
|
113
119
|
end # module
|
114
120
|
end
|
@@ -31,7 +31,7 @@ module SknUtils
|
|
31
31
|
class LinkedCommons
|
32
32
|
attr_accessor :size
|
33
33
|
|
34
|
-
# Initialize and return first node if nodes are available
|
34
|
+
# Initialize and return first node if nodes are available, else class instance
|
35
35
|
def self.call(*vargs, &compare_key_proc)
|
36
36
|
target = self.new(*vargs, &compare_key_proc)
|
37
37
|
return target.instance_variable_get(:@current) if vargs.size > 1
|
@@ -103,22 +103,11 @@ module SknUtils
|
|
103
103
|
rc
|
104
104
|
end
|
105
105
|
|
106
|
-
# return new size
|
107
|
-
def insert(value)
|
108
|
-
temp = @current.value rescue nil
|
109
|
-
insert_after(temp, value)
|
110
|
-
end
|
111
|
-
|
112
106
|
# return new size
|
113
107
|
def prepend(value)
|
114
108
|
temp = self.head.value rescue nil
|
115
109
|
insert_before(temp, value)
|
116
110
|
end
|
117
|
-
# return new size
|
118
|
-
def append(value)
|
119
|
-
temp = self.tail.value rescue nil
|
120
|
-
insert_after(temp, value)
|
121
|
-
end
|
122
111
|
|
123
112
|
#
|
124
113
|
# Enumerate
|
@@ -127,7 +116,7 @@ module SknUtils
|
|
127
116
|
# perform each() or return enumerator
|
128
117
|
def each(&block)
|
129
118
|
@current = self.head
|
130
|
-
position =
|
119
|
+
position = @current
|
131
120
|
if block_given?
|
132
121
|
while position do
|
133
122
|
block.call( position.value.dup )
|
@@ -180,6 +169,19 @@ module SknUtils
|
|
180
169
|
|
181
170
|
attr_accessor :head, :tail
|
182
171
|
|
172
|
+
# scan for first occurance of matching value
|
173
|
+
def find_by_value(value)
|
174
|
+
return nil if value.nil? || self.size == 0
|
175
|
+
stop_node = self.head
|
176
|
+
target = stop_node
|
177
|
+
while target && !target.match_by_value(value)
|
178
|
+
target = target.next
|
179
|
+
break if stop_node.equal?(target)
|
180
|
+
end
|
181
|
+
target = nil unless target && target.match_by_value(value)
|
182
|
+
target
|
183
|
+
end
|
184
|
+
|
183
185
|
# Merged Sort via Ref: http://rubyalgorithms.com/merge_sort.html
|
184
186
|
# arr is Array to be sorted, sort_cond is Proc expecting a/b params returning true/false
|
185
187
|
def merge_sort(arr)
|
@@ -203,18 +205,6 @@ module SknUtils
|
|
203
205
|
sorted + left + right
|
204
206
|
end
|
205
207
|
|
206
|
-
# Retrieves requested node, not value
|
207
|
-
def node_request(method_sym=:current, *vargs, &block)
|
208
|
-
position_value = block_given? ? send(method_sym, *vargs, block) :
|
209
|
-
(vargs.size == 0 ? send(method_sym) : send(method_sym, *vargs))
|
210
|
-
@current
|
211
|
-
end
|
212
|
-
# Retrieves requested value, not node
|
213
|
-
def node_value_request(method_sym=:current, *vargs, &block)
|
214
|
-
position_value = block_given? ? send(method_sym, *vargs, block) :
|
215
|
-
(vargs.size == 0 ? send(method_sym) : send(method_sym, *vargs))
|
216
|
-
end
|
217
|
-
|
218
208
|
end
|
219
209
|
end # module
|
220
210
|
end
|
@@ -56,10 +56,19 @@ module SknUtils
|
|
56
56
|
# Modifications
|
57
57
|
#
|
58
58
|
|
59
|
+
def insert(value)
|
60
|
+
node = @current
|
61
|
+
@current = LinkNode.call(value, node, :single, self, &@match_value)
|
62
|
+
self.head = @current if self.head.nil?
|
63
|
+
self.tail = @current if self.tail.equal?(node)
|
64
|
+
self.size += 1
|
65
|
+
end
|
66
|
+
alias_method :append, :insert
|
67
|
+
|
59
68
|
# return new size
|
60
69
|
def insert_before(position_value, value)
|
61
70
|
prior, target = find_by_value(position_value)
|
62
|
-
node = LinkNode.
|
71
|
+
node = LinkNode.call(value, prior, :single, self, &@match_value)
|
63
72
|
node.next = target if target
|
64
73
|
self.head = node if self.head.equal?(target)
|
65
74
|
self.tail = node if self.tail.nil?
|
@@ -70,7 +79,7 @@ module SknUtils
|
|
70
79
|
# return new size
|
71
80
|
def insert_after(position_value, value)
|
72
81
|
prior, target = find_by_value(position_value)
|
73
|
-
node = LinkNode.
|
82
|
+
node = LinkNode.call(value, target, :single, self, &@match_value)
|
74
83
|
self.head = node if self.head.nil?
|
75
84
|
self.tail = node if self.tail.equal?(target)
|
76
85
|
@current = node
|
@@ -93,10 +102,9 @@ module SknUtils
|
|
93
102
|
return [@current, nil] if self.head.nil? || value.nil?
|
94
103
|
prior = self.head
|
95
104
|
target = prior
|
96
|
-
while target
|
105
|
+
while target && !target.match_by_value(value)
|
97
106
|
prior = target
|
98
107
|
target = target.next
|
99
|
-
@current = prior if target
|
100
108
|
end
|
101
109
|
[prior, target]
|
102
110
|
end
|
data/lib/skn_utils/version.rb
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
RSpec.describe SknUtils::Lists::DoublyLinkedList, "DoublyLinkedList using node interface " do
|
6
6
|
|
7
7
|
context "Node Interface Edge Cases " do
|
8
|
-
let(:node) { described_class.call(10,20, 30, 40, 50, 60, 70, 80, 90, 100) {|a| a} }
|
8
|
+
let(:node) { described_class.call(10, 20, 30, 40, 50, 60, 60, 70, 80, 90, 100) {|a| a} }
|
9
9
|
|
10
10
|
context "Node Retrieval " do
|
11
11
|
|
@@ -55,6 +55,7 @@ RSpec.describe SknUtils::Lists::DoublyLinkedList, "DoublyLinkedList using node i
|
|
55
55
|
end
|
56
56
|
|
57
57
|
expect(nav_ary).to eq(node.node_value_request(:to_a))
|
58
|
+
expect(nav_ary).to eq([10, 20, 30, 40, 50, 60, 60, 70, 80, 90, 100])
|
58
59
|
end
|
59
60
|
end
|
60
61
|
|
@@ -120,8 +120,8 @@ RSpec.shared_examples "a linked list" do |list_type|
|
|
120
120
|
context "Sort Feature" do
|
121
121
|
let(:num_list) { described_class.new(100, 50, 10, 40, 80, 30, 60, 90, 70, 20, 110) }
|
122
122
|
let(:alpha_list) { described_class.new('Z', 'K', 'S', 'n', 's', 'z', 'k', 'N', 'o', 'A') }
|
123
|
-
let(:hash_list) { described_class.new({key: 'Z'}, {key: 'K'}, {key: 'S'}, {key: 'n'}, {key: 's'},
|
124
|
-
{key: 'z'}, {key: 'k'}, {key: 'N'}, {key: '
|
123
|
+
let(:hash_list) { described_class.new({key: 'Z'}, {key: 'K'}, {key: 'S'}, {:key=>"S"}, {key: 'n'}, {key: 's'},
|
124
|
+
{key: 'z'}, {key: 'k'}, {key: 'N'}, {key: 'A'}
|
125
125
|
) {|a| a[:key]}
|
126
126
|
}
|
127
127
|
|
@@ -143,13 +143,13 @@ RSpec.shared_examples "a linked list" do |list_type|
|
|
143
143
|
end
|
144
144
|
it "#sort!() redefines hash object values in default order" do
|
145
145
|
expect(hash_list.sort!).to eq(10)
|
146
|
-
expect(hash_list.to_a).to eq([{:key=>"A"}, {:key=>"K"}, {:key=>"N"}, {:key=>"S"}, {:key=>"Z"},
|
147
|
-
{:key=>"k"}, {:key=>"n"}, {:key=>"
|
146
|
+
expect(hash_list.to_a).to eq([{:key=>"A"}, {:key=>"K"}, {:key=>"N"}, {:key=>"S"}, {:key=>"S"}, {:key=>"Z"},
|
147
|
+
{:key=>"k"}, {:key=>"n"}, {:key=>"s"}, {:key=>"z"}])
|
148
148
|
end
|
149
149
|
it "#sort!() lambda overrides sort_condifiton and sorts hash object values in custom order" do
|
150
150
|
expect(hash_list.sort!() {|a,b| a[:key] <= b[:key] }).to eq(10)
|
151
|
-
expect(hash_list.to_a).to eq([{:key=>"z"}, {:key=>"s"}, {:key=>"
|
152
|
-
{:key=>"Z"}, {:key=>"S"}, {:key=>"N"}, {:key=>"K"}, {:key=>"A"}])
|
151
|
+
expect(hash_list.to_a).to eq([{:key=>"z"}, {:key=>"s"}, {:key=>"n"}, {:key=>"k"},
|
152
|
+
{:key=>"Z"}, {:key=>"S"}, {:key=>"S"}, {:key=>"N"}, {:key=>"K"}, {:key=>"A"}])
|
153
153
|
end
|
154
154
|
end
|
155
155
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: skn_utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.3.
|
4
|
+
version: 3.3.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Scott Jr
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-08-
|
11
|
+
date: 2017-08-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: deep_merge
|