skn_utils 3.3.2 → 3.3.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d2f654cc636fb8d2694432b991fc8c145dd81d01
4
- data.tar.gz: 3f7a28e3be152907b0b25949a371855cb739de2b
3
+ metadata.gz: 32848790967a49e9c69c81c3cf46744ccc1fde9c
4
+ data.tar.gz: 5801f319e98845bc7454af452a6df47339e2eb58
5
5
  SHA512:
6
- metadata.gz: e5e65ca3ada647ad23c5a26d224b025b2e14a00e63e0f15d2ce35823c7df69e77720d43fa53c40af0abf6e5297346c98b321dd2bc244f20ed012b3633296a8bf
7
- data.tar.gz: e68c4b224458eb5aa669fd776177c433812705e54006f0fcf12c5b122d1f4a1b9ba1f9fc5744800cb83d158bdb587492ac2eebf88fb4fedf848afe3115afb630
6
+ metadata.gz: 25c689c0230fc7b07e24b3f2d13a490ee42fa67da69b3a61f0fc4546959abde80241f40004ac0c1548c73a92afdb2fbcb32d5da4f315b3856525d42ea6671d86
7
+ data.tar.gz: 9d9cd56d940ecf86e0da143286689fc8b3dcaa6161c179f9b60a815dd0ccd26d8508b466c6b68a3cfd7a432f41bd374ab4b86a774fb1d91ca6f145282e866fee
data/README.md CHANGED
@@ -89,6 +89,9 @@ Ruby Gem containing a Ruby PORO (Plain Old Ruby Object) that can be instantiated
89
89
  #clear -- removes all elements and return number of elements removed
90
90
  #empty? -- returns true if list has no elements, otherwise false
91
91
  #size -- returns total count of elements in the list
92
+ #sort!(:direction, &block) -- Sort existing list in place using :direction (:asc,:desc, :default) symbol
93
+ if block is given, overrides :direction and uses custom proc to compare values
94
+ block format is: {|a,b| a >= b }; example: 'll.sort(:default) {|a,b| a <= b}'
92
95
 
93
96
  Modification: returns number of elements in the list after the operation
94
97
  #insert(value) -- inserts value after node at current positon, or appends
@@ -98,8 +101,10 @@ Ruby Gem containing a Ruby PORO (Plain Old Ruby Object) that can be instantiated
98
101
  #insert_after(position_value, value) -- finds node matching position_value, then appends new node
99
102
  #remove(value) -- finds first node matching value, then destroys it
100
103
 
101
- Initialization
102
- #new(*values=nil) -- Instansiates new list and optionally creates nodes for each comma-seperated value.
104
+ Initialization: optional &block to identify data key
105
+ #new(*vargs, &block) -- Instansiates new list and optionally creates nodes from each comma-seperated value;
106
+ also, assigns &block as default value identifier for find and sort operations
107
+ compare_key_block example: LinkedList.new({:key=>"Z"},{:key=>"S"},{:key=>"N"}) {|a| a[:key]}
103
108
 
104
109
 
105
110
  ## Public Methods: SknSettings ONLY
data/bin/benchmark.rb CHANGED
@@ -1,11 +1,42 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ #
4
+ # Ref: https://github.com/evanphx/benchmark-ips
5
+ #
6
+
3
7
  require 'bundler/setup'
4
8
  require 'skn_utils'
5
9
  require 'ostruct'
6
10
  require 'benchmark/ips'
7
11
 
12
+ class GCSuite
13
+ def warming(*)
14
+ run_gc
15
+ end
16
+
17
+ def running(*)
18
+ run_gc
19
+ end
20
+
21
+ def warmup_stats(*)
22
+ end
23
+
24
+ def add_report(*)
25
+ end
26
+
27
+ private
28
+
29
+ def run_gc
30
+ GC.enable
31
+ GC.start
32
+ GC.disable
33
+ end
34
+ end
35
+
36
+ suite = GCSuite.new
37
+
8
38
  Benchmark.ips do |x|
39
+ x.config(:suite => suite)
9
40
 
10
41
  class RegularClass
11
42
  attr_accessor :foo
@@ -31,13 +62,57 @@ Benchmark.ips do |x|
31
62
  n.foo = :bar
32
63
  n.foo
33
64
  end
65
+
66
+ x.compare!
34
67
  end
35
68
 
36
69
  # Warming up --------------------------------------
37
- # regular class 182.079k i/100ms
38
- # OpenStruct class 12.129k i/100ms
39
- # NestedResult class 11.075k i/100ms
70
+ # regular class 179.755k i/100ms
71
+ # OpenStruct class 11.367k i/100ms
72
+ # NestedResult class 9.674k i/100ms
73
+ # Calculating -------------------------------------
74
+ # regular class 3.674M (±17.4%) i/s - 17.256M in 5.001576s
75
+ # OpenStruct class 155.394k (±31.2%) i/s - 670.653k in 5.095404s
76
+ # NestedResult class 119.896k (±39.0%) i/s - 493.374k in 5.212147s
77
+ #
78
+ # Comparison:
79
+ # regular class: 3673640.5 i/s
80
+ # OpenStruct class: 155394.0 i/s - 23.64x slower
81
+ # NestedResult class: 119896.1 i/s - 30.64x slower
82
+ #
83
+ # Warming up --------------------------------------
84
+ # LinkedList Ops 2.297k i/100ms
85
+ # Array Ops 34.468k i/100ms
40
86
  # Calculating -------------------------------------
41
- # regular class 4.140M 2.2%) i/s - 20.757M in 5.015689s
42
- # OpenStruct class 129.418k2.3%) i/s - 654.966k in 5.063580s
43
- # NestedResult class 115.819k (± 2.3%) i/s - 586.975k in 5.070852s
87
+ # LinkedList Ops 17.015k35.2%) i/s - 71.207k in 5.100193s
88
+ # Array Ops 377.943k7.3%) i/s - 1.896M in 5.048217s
89
+ #
90
+ # Comparison:
91
+ # Array Ops: 377942.7 i/s
92
+ # LinkedList Ops: 17015.4 i/s - 22.21x slower
93
+
94
+
95
+ Benchmark.ips do |x|
96
+ x.config(:suite => suite)
97
+
98
+ adders = [50, 10, 110, 6, 30, 101, 12, 33, 4]
99
+ vargs = [70, 71, 72, 73, 74, 75, 76, 77, 78, 79]
100
+
101
+ x.report('LinkedList Ops') do
102
+ ll = SknUtils::Lists::LinkedList.new(*vargs)
103
+ adders.each {|x| ll.insert_after(74, x)}
104
+ value = ll.sort!
105
+ ll.first
106
+ ll.clear
107
+ end
108
+
109
+ x.report('Array Ops') do
110
+ ary = Array.new(vargs)
111
+ adders.each {|x| ary.insert(5, x)}
112
+ value = ary.sort!
113
+ ary.first
114
+ ary.clear
115
+ end
116
+
117
+ x.compare!
118
+ end
@@ -7,15 +7,16 @@ module SknUtils
7
7
  class CircularLinkedList
8
8
  attr_accessor :size
9
9
 
10
- def initialize(*vargs, &block)
10
+ def initialize(*vargs, &compare_key_proc)
11
11
  @current = nil
12
12
  @head = nil
13
13
  @tail = nil
14
14
  @size = 0
15
15
 
16
- @sort_ascending = lambda {|a_obj,b_obj| a_obj >= b_obj}
17
- @sort_descending = lambda {|a_obj,b_obj| a_obj <= b_obj}
18
- @sort_condition = block_given? ? block : @sort_ascending
16
+ @match_value = block_given? ? compare_key_proc : lambda {|obj| obj }
17
+ @sort_ascending = lambda {|a_obj,b_obj| @match_value.call(a_obj) >= @match_value.call(b_obj)}
18
+ @sort_descending = lambda {|a_obj,b_obj| @match_value.call(a_obj) <= @match_value.call(b_obj)}
19
+ @sort_condition = @sort_ascending
19
20
 
20
21
  vargs.each {|value| insert(value) }
21
22
  first if vargs.size > 1
@@ -107,7 +108,7 @@ module SknUtils
107
108
  # return new size
108
109
  def insert_before(position_value, value)
109
110
  target = find_by_value(position_value)
110
- node = LinkNode.new(value, target, :circle_before)
111
+ node = LinkNode.new(value, target, :circle_before, &@match_value)
111
112
  @current = node if target
112
113
  self.head = node if head === target
113
114
  self.tail = node if tail.nil?
@@ -117,7 +118,7 @@ module SknUtils
117
118
  # return new size
118
119
  def insert_after(position_value, value)
119
120
  target = find_by_value(position_value)
120
- node = LinkNode.new(value, target, :circle_after)
121
+ node = LinkNode.new(value, target, :circle_after, &@match_value)
121
122
  @current = node
122
123
  self.head = node if head.nil?
123
124
  self.tail = node if tail === target
@@ -166,12 +167,12 @@ module SknUtils
166
167
  position = head
167
168
  if block_given?
168
169
  while position do
169
- yield position.value.dup
170
+ block.call( position.value.dup )
170
171
  position = position.next
171
172
  break if position === @current
172
173
  end
173
174
  else
174
- Enumerator.new do |yielder, val|
175
+ Enumerator.new do |yielder|
175
176
  while position do
176
177
  yielder << position.value.dup
177
178
  position = position.next
@@ -195,19 +196,17 @@ module SknUtils
195
196
  end
196
197
 
197
198
  # block format: sort condition : {|a_obj,b_obj| a_obj >= b_obj}
198
- def sort!(direction_sym=:default, &block)
199
- active_sort_condition = block_given? ? block :
200
- (
201
- case direction_sym
202
- when :asc
203
- @sort_ascending
204
- when :desc
205
- @sort_descending
206
- else
207
- @sort_condition
208
- end
209
- )
210
- sorted = merge_sort(to_a, active_sort_condition)
199
+ def sort!(direction_sym=:default, &compare_sort_proc)
200
+ @active_sort_condition = block_given? ? compare_sort_proc :
201
+ case direction_sym
202
+ when :asc
203
+ @sort_ascending
204
+ when :desc
205
+ @sort_descending
206
+ else
207
+ @sort_condition
208
+ end
209
+ sorted = merge_sort(to_a)
211
210
  clear
212
211
  sorted.each {|item| insert(item) }
213
212
  size
@@ -218,10 +217,10 @@ module SknUtils
218
217
  attr_accessor :head, :tail
219
218
 
220
219
  def find_by_value(value)
221
- return nil if head.nil?
220
+ return nil if head.nil? or value.nil? or size == 0
222
221
  prior = head
223
222
  target = prior
224
- while not target.match_by_value(value)
223
+ while target and not target.match_by_value(value)
225
224
  prior = target
226
225
  target = prior.next
227
226
  @current = target if target
@@ -239,23 +238,23 @@ module SknUtils
239
238
 
240
239
  # Merged Sort via Ref: http://rubyalgorithms.com/merge_sort.html
241
240
  # arr is Array to be sorted, sort_cond is Proc expecting a/b params returning true/false
242
- def merge_sort(arr, sort_cond)
241
+ def merge_sort(arr)
243
242
  return arr if arr.size < 2
244
243
 
245
244
  middle = arr.size / 2
246
245
 
247
- left = merge_sort(arr[0...middle], sort_cond)
248
- right = merge_sort(arr[middle..arr.size], sort_cond)
246
+ left = merge_sort(arr[0...middle])
247
+ right = merge_sort(arr[middle..arr.size])
249
248
 
250
- merge(left, right, sort_cond)
249
+ merge(left, right)
251
250
  end
252
251
 
253
- def merge(left, right, sort_cond)
252
+ def merge(left, right)
254
253
  sorted = []
255
254
 
256
255
  while left.any? && right.any?
257
256
 
258
- if sort_cond.call(left.first, right.first) # replace this condition with a proc
257
+ if @active_sort_condition.call(left.first, right.first)
259
258
  sorted.push right.shift
260
259
  else
261
260
  sorted.push left.shift
@@ -8,15 +8,16 @@ module SknUtils
8
8
  class DoublyLinkedList
9
9
  attr_accessor :size
10
10
 
11
- def initialize(*vargs, &block)
11
+ def initialize(*vargs, &compare_key_proc)
12
12
  @current = nil
13
13
  @head = nil
14
14
  @tail = nil
15
15
  @size = 0
16
16
 
17
- @sort_ascending = lambda {|a_obj,b_obj| a_obj >= b_obj}
18
- @sort_descending = lambda {|a_obj,b_obj| a_obj <= b_obj}
19
- @sort_condition = block_given? ? block : @sort_ascending
17
+ @match_value = block_given? ? compare_key_proc : lambda {|obj| obj }
18
+ @sort_ascending = lambda {|a_obj,b_obj| @match_value.call(a_obj) >= @match_value.call(b_obj)}
19
+ @sort_descending = lambda {|a_obj,b_obj| @match_value.call(a_obj) <= @match_value.call(b_obj)}
20
+ @sort_condition = @sort_ascending
20
21
 
21
22
  vargs.each {|value| insert(value) }
22
23
  first if vargs.size > 1
@@ -105,7 +106,7 @@ module SknUtils
105
106
  # return new size
106
107
  def insert_before(position_value, value)
107
108
  target = find_by_value(position_value)
108
- node = LinkNode.new(value, target, :before)
109
+ node = LinkNode.new(value, target, :before, &@match_value)
109
110
  @current = node if target
110
111
  self.head = node if head === target
111
112
  self.tail = node if tail.nil?
@@ -115,7 +116,7 @@ module SknUtils
115
116
  # return new size
116
117
  def insert_after(position_value, value)
117
118
  target = find_by_value(position_value)
118
- node = LinkNode.new(value, target, :after)
119
+ node = LinkNode.new(value, target, :after, &@match_value)
119
120
  @current = node
120
121
  self.head = node if head.nil?
121
122
  self.tail = node if tail === target
@@ -164,7 +165,7 @@ module SknUtils
164
165
  position = head
165
166
  if block_given?
166
167
  while position do
167
- yield position.value.dup
168
+ block.call( position.value.dup )
168
169
  position = position.next
169
170
  break if position === @current
170
171
  end
@@ -193,19 +194,17 @@ module SknUtils
193
194
  end
194
195
 
195
196
  # block format: sort condition : {|a_obj,b_obj| a_obj >= b_obj}
196
- def sort!(direction_sym=:default, &block)
197
- active_sort_condition = block_given? ? block :
198
- (
199
- case direction_sym
200
- when :asc
201
- @sort_ascending
202
- when :desc
203
- @sort_descending
204
- else
205
- @sort_condition
206
- end
207
- )
208
- sorted = merge_sort(to_a, active_sort_condition)
197
+ def sort!(direction_sym=:default, &compare_sort_proc)
198
+ @active_sort_condition = block_given? ? compare_sort_proc :
199
+ case direction_sym
200
+ when :asc
201
+ @sort_ascending
202
+ when :desc
203
+ @sort_descending
204
+ else
205
+ @sort_condition
206
+ end
207
+ sorted = merge_sort(to_a)
209
208
  clear
210
209
  sorted.each {|item| insert(item) }
211
210
  size
@@ -216,10 +215,10 @@ module SknUtils
216
215
  attr_accessor :head, :tail
217
216
 
218
217
  def find_by_value(value)
219
- return nil if head.nil?
218
+ return nil if head.nil? or value.nil?
220
219
  prior = head
221
220
  target = prior
222
- while not target.match_by_value(value)
221
+ while target and not target.match_by_value(value)
223
222
  prior = target
224
223
  target = prior.next
225
224
  @current = target if target
@@ -237,23 +236,23 @@ module SknUtils
237
236
 
238
237
  # Merged Sort via Ref: http://rubyalgorithms.com/merge_sort.html
239
238
  # arr is Array to be sorted, sort_cond is Proc expecting a/b params returning true/false
240
- def merge_sort(arr, sort_cond)
239
+ def merge_sort(arr)
241
240
  return arr if arr.size < 2
242
241
 
243
242
  middle = arr.size / 2
244
243
 
245
- left = merge_sort(arr[0...middle], sort_cond)
246
- right = merge_sort(arr[middle..arr.size], sort_cond)
244
+ left = merge_sort(arr[0...middle])
245
+ right = merge_sort(arr[middle..arr.size])
247
246
 
248
- merge(left, right, sort_cond)
247
+ merge(left, right)
249
248
  end
250
249
 
251
- def merge(left, right, sort_cond)
250
+ def merge(left, right)
252
251
  sorted = []
253
252
 
254
253
  while left.any? && right.any?
255
254
 
256
- if sort_cond.call(left.first, right.first) # replace this condition with a proc
255
+ if @active_sort_condition.call(left.first, right.first)
257
256
  sorted.push right.shift
258
257
  else
259
258
  sorted.push left.shift
@@ -8,10 +8,11 @@ module SknUtils
8
8
  class LinkNode
9
9
  attr_accessor :prev, :next, :value
10
10
 
11
- def initialize(val, anchor_node=nil, strategy=:after)
11
+ def initialize(val, anchor_node=nil, strategy=:after, &cmp_key)
12
12
  @value = val
13
13
  @prev = nil
14
14
  @next = nil
15
+ @cmp_proc = block_given? ? cmp_key : lambda {|a| a }
15
16
 
16
17
  case strategy
17
18
  when :single # after logic
@@ -39,7 +40,7 @@ module SknUtils
39
40
  end
40
41
 
41
42
  def match_by_value(other_value)
42
- self.value === other_value
43
+ @cmp_proc.call(value) === @cmp_proc.call(other_value)
43
44
  end
44
45
 
45
46
  # returns next node
@@ -8,16 +8,19 @@ module SknUtils
8
8
  class LinkedList
9
9
  attr_accessor :size
10
10
 
11
- def initialize(*vargs, &block)
11
+ # &compare_key_proc supplies an method to identify
12
+ # the key of an object for comparison purposes
13
+ def initialize(*vargs, &compare_key_proc)
12
14
  @sort_condition = nil
13
15
  @current = nil
14
16
  @head = nil
15
17
  @tail = nil
16
18
  @size = 0
17
19
 
18
- @sort_ascending = lambda {|a_obj,b_obj| a_obj >= b_obj}
19
- @sort_descending = lambda {|a_obj,b_obj| a_obj <= b_obj}
20
- @sort_condition = block_given? ? block : @sort_ascending
20
+ @match_value = block_given? ? compare_key_proc : lambda {|obj| obj }
21
+ @sort_ascending = lambda {|a_obj,b_obj| @match_value.call(a_obj) >= @match_value.call(b_obj)}
22
+ @sort_descending = lambda {|a_obj,b_obj| @match_value.call(a_obj) <= @match_value.call(b_obj)}
23
+ @sort_condition = @sort_ascending
21
24
 
22
25
  vargs.each {|value| insert(value) }
23
26
  first if vargs.size > 1
@@ -96,7 +99,7 @@ module SknUtils
96
99
  # return new size
97
100
  def insert_before(position_value, value)
98
101
  prior, target = find_by_value(position_value)
99
- node = LinkNode.new(value, prior, :single)
102
+ node = LinkNode.new(value, prior, :single, &@match_value)
100
103
  node.next = target if target
101
104
  self.head = node if head === target
102
105
  self.tail = node if tail.nil?
@@ -107,7 +110,7 @@ module SknUtils
107
110
  # return new size
108
111
  def insert_after(position_value, value)
109
112
  prior, target = find_by_value(position_value)
110
- node = LinkNode.new(value, target, :single)
113
+ node = LinkNode.new(value, target, :single, &@match_value)
111
114
  self.head = node if head.nil?
112
115
  self.tail = node if tail === target
113
116
  @current = node
@@ -118,8 +121,8 @@ module SknUtils
118
121
  def remove(value)
119
122
  @current, target_node = find_by_value(value)
120
123
  @current.next = target_node.remove!
121
- tail = @current.next if tail === target_node
122
- head = @current if head === target_node
124
+ self.tail = @current.next if tail === target_node
125
+ self.head = @current if head === target_node
123
126
  self.size -= 1
124
127
  end
125
128
 
@@ -151,7 +154,7 @@ module SknUtils
151
154
  position = head
152
155
  if block_given?
153
156
  while position do
154
- yield position.value.dup
157
+ block.call(position.value.dup )
155
158
  position = position.next
156
159
  end
157
160
  else
@@ -178,8 +181,8 @@ module SknUtils
178
181
  end
179
182
 
180
183
  # block format: sort condition : {|a_obj,b_obj| a_obj >= b_obj}
181
- def sort!(direction_sym=:default, &block)
182
- active_sort_condition = block_given? ? block :
184
+ def sort!(direction_sym=:default, &compare_sort_proc)
185
+ @active_sort_condition = block_given? ? compare_sort_proc :
183
186
  case direction_sym
184
187
  when :asc
185
188
  @sort_ascending
@@ -189,7 +192,7 @@ module SknUtils
189
192
  @sort_condition
190
193
  end
191
194
 
192
- sorted = merge_sort(to_a, active_sort_condition)
195
+ sorted = merge_sort(to_a)
193
196
  clear
194
197
  sorted.each {|item| insert(item) }
195
198
  size
@@ -200,10 +203,10 @@ module SknUtils
200
203
  attr_accessor :head, :tail
201
204
 
202
205
  def find_by_value(value)
203
- return [nil,nil] if head.nil?
206
+ return [nil,nil] if head.nil? or value.nil?
204
207
  prior = head
205
208
  target = prior
206
- while not target.match_by_value(value)
209
+ while target and not target.match_by_value(value)
207
210
  prior = target
208
211
  target = prior.next
209
212
  @current = target if target
@@ -221,23 +224,23 @@ module SknUtils
221
224
 
222
225
  # Merged Sort via Ref: http://rubyalgorithms.com/merge_sort.html
223
226
  # arr is Array to be sorted, sort_cond is Proc expecting a/b params returning true/false
224
- def merge_sort(arr, sort_cond)
227
+ def merge_sort(arr)
225
228
  return arr if arr.size < 2
226
229
 
227
230
  middle = arr.size / 2
228
231
 
229
- left = merge_sort(arr[0...middle], sort_cond)
230
- right = merge_sort(arr[middle..arr.size], sort_cond)
232
+ left = merge_sort(arr[0...middle])
233
+ right = merge_sort(arr[middle..arr.size])
231
234
 
232
- merge(left, right, sort_cond)
235
+ merge(left, right)
233
236
  end
234
237
 
235
- def merge(left, right, sort_cond)
238
+ def merge(left, right)
236
239
  sorted = []
237
240
 
238
241
  while left.any? && right.any?
239
242
 
240
- if sort_cond.call(left.first, right.first) # replace this condition with a proc
243
+ if @active_sort_condition.call(left.first, right.first)
241
244
  sorted.push right.shift
242
245
  else
243
246
  sorted.push left.shift
@@ -3,7 +3,7 @@ module SknUtils
3
3
  class Version
4
4
  MAJOR = 3
5
5
  MINOR = 3
6
- PATCH = 2
6
+ PATCH = 3
7
7
 
8
8
  def self.to_s
9
9
  [MAJOR, MINOR, PATCH].join('.')
@@ -243,7 +243,7 @@ RSpec.describe SknUtils::Lists::CircularLinkedList, "Circular LinkedList " do
243
243
  let(:alpha_list) { described_class.new('Z', 'K', 'S', 'n', 's', 'z', 'k', 'N', 'o', 'A') }
244
244
  let(:hash_list) { described_class.new({key: 'Z'}, {key: 'K'}, {key: 'S'}, {key: 'n'}, {key: 's'},
245
245
  {key: 'z'}, {key: 'k'}, {key: 'N'}, {key: 'o'}, {key: 'A'}
246
- ) {|a,b| a[:key] >= b[:key] }
246
+ ) {|a| a[:key]}
247
247
  }
248
248
 
249
249
  it "#sort! redefines numeric list in asending order" do
@@ -243,7 +243,7 @@ RSpec.describe SknUtils::Lists::DoublyLinkedList, "Double-Ended LinkedList " do
243
243
  let(:alpha_list) { described_class.new('Z', 'K', 'S', 'n', 's', 'z', 'k', 'N', 'o', 'A') }
244
244
  let(:hash_list) { described_class.new({key: 'Z'}, {key: 'K'}, {key: 'S'}, {key: 'n'}, {key: 's'},
245
245
  {key: 'z'}, {key: 'k'}, {key: 'N'}, {key: 'o'}, {key: 'A'}
246
- ) {|a,b| a[:key] >= b[:key] }
246
+ ) {|a| a[:key]}
247
247
  }
248
248
 
249
249
  it "#sort! redefines numeric list in asending order" do
@@ -236,7 +236,7 @@ RSpec.describe SknUtils::Lists::LinkedList, "Singular LinkedList " do
236
236
  let(:alpha_list) { described_class.new('Z', 'K', 'S', 'n', 's', 'z', 'k', 'N', 'o', 'A') }
237
237
  let(:hash_list) { described_class.new({key: 'Z'}, {key: 'K'}, {key: 'S'}, {key: 'n'}, {key: 's'},
238
238
  {key: 'z'}, {key: 'k'}, {key: 'N'}, {key: 'o'}, {key: 'A'}
239
- ) {|a,b| a[:key] >= b[:key] }
239
+ ) {|a| a[:key]}
240
240
  }
241
241
 
242
242
  it "#sort! redefines numeric list in asending order" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: skn_utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.2
4
+ version: 3.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Scott Jr