skn_utils 3.3.8 → 3.3.9
Sign up to get free protection for your applications and to get access to all the features.
- 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
|