skn_utils 3.3.1 → 3.3.2

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: fb741d6ef4692e94ee1f7649bc655bdac1fcc068
4
- data.tar.gz: da995ac562de18cea5b4c8950e6ae37349926947
3
+ metadata.gz: d2f654cc636fb8d2694432b991fc8c145dd81d01
4
+ data.tar.gz: 3f7a28e3be152907b0b25949a371855cb739de2b
5
5
  SHA512:
6
- metadata.gz: 0c9c7ce7644387a73836ceb91fa9efd184c65e0ad8ca35702be2539d94aff52edaac42b579fa18eb7a858d3283d6fd103c27aabf6210f5d8b2b0419052a9e4c3
7
- data.tar.gz: 5623acf078e653111cc05a56e5a195758e9ef8908722a71ae3ac8a1ba31340fcbbe204ae9612a8140540863d4765dd4cd21d6b4fc9473ae7ee1c7dd1cf8b5d4f
6
+ metadata.gz: e5e65ca3ada647ad23c5a26d224b025b2e14a00e63e0f15d2ce35823c7df69e77720d43fa53c40af0abf6e5297346c98b321dd2bc244f20ed012b3633296a8bf
7
+ data.tar.gz: e68c4b224458eb5aa669fd776177c433812705e54006f0fcf12c5b122d1f4a1b9ba1f9fc5744800cb83d158bdb587492ac2eebf88fb4fedf848afe3115afb630
@@ -7,13 +7,18 @@ module SknUtils
7
7
  class CircularLinkedList
8
8
  attr_accessor :size
9
9
 
10
- def initialize(*values)
10
+ def initialize(*vargs, &block)
11
11
  @current = nil
12
12
  @head = nil
13
13
  @tail = nil
14
14
  @size = 0
15
- values.each {|value| insert(value) }
16
- first if values.size > 1
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
19
+
20
+ vargs.each {|value| insert(value) }
21
+ first if vargs.size > 1
17
22
  end
18
23
 
19
24
  #
@@ -189,6 +194,25 @@ module SknUtils
189
194
  result
190
195
  end
191
196
 
197
+ # 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)
211
+ clear
212
+ sorted.each {|item| insert(item) }
213
+ size
214
+ end
215
+
192
216
  private
193
217
 
194
218
  attr_accessor :head, :tail
@@ -213,6 +237,35 @@ module SknUtils
213
237
  node
214
238
  end
215
239
 
240
+ # Merged Sort via Ref: http://rubyalgorithms.com/merge_sort.html
241
+ # arr is Array to be sorted, sort_cond is Proc expecting a/b params returning true/false
242
+ def merge_sort(arr, sort_cond)
243
+ return arr if arr.size < 2
244
+
245
+ middle = arr.size / 2
246
+
247
+ left = merge_sort(arr[0...middle], sort_cond)
248
+ right = merge_sort(arr[middle..arr.size], sort_cond)
249
+
250
+ merge(left, right, sort_cond)
251
+ end
252
+
253
+ def merge(left, right, sort_cond)
254
+ sorted = []
255
+
256
+ while left.any? && right.any?
257
+
258
+ if sort_cond.call(left.first, right.first) # replace this condition with a proc
259
+ sorted.push right.shift
260
+ else
261
+ sorted.push left.shift
262
+ end
263
+
264
+ end
265
+
266
+ sorted + left + right
267
+ end
268
+
216
269
  end # end class
217
270
  end # module
218
271
  end # end module
@@ -8,13 +8,18 @@ module SknUtils
8
8
  class DoublyLinkedList
9
9
  attr_accessor :size
10
10
 
11
- def initialize(*values)
11
+ def initialize(*vargs, &block)
12
12
  @current = nil
13
13
  @head = nil
14
14
  @tail = nil
15
15
  @size = 0
16
- values.each {|value| insert(value) }
17
- first if values.size > 1
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
20
+
21
+ vargs.each {|value| insert(value) }
22
+ first if vargs.size > 1
18
23
  end
19
24
 
20
25
  #
@@ -187,6 +192,25 @@ module SknUtils
187
192
  result
188
193
  end
189
194
 
195
+ # 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)
209
+ clear
210
+ sorted.each {|item| insert(item) }
211
+ size
212
+ end
213
+
190
214
  private
191
215
 
192
216
  attr_accessor :head, :tail
@@ -211,6 +235,35 @@ module SknUtils
211
235
  node
212
236
  end
213
237
 
238
+ # Merged Sort via Ref: http://rubyalgorithms.com/merge_sort.html
239
+ # arr is Array to be sorted, sort_cond is Proc expecting a/b params returning true/false
240
+ def merge_sort(arr, sort_cond)
241
+ return arr if arr.size < 2
242
+
243
+ middle = arr.size / 2
244
+
245
+ left = merge_sort(arr[0...middle], sort_cond)
246
+ right = merge_sort(arr[middle..arr.size], sort_cond)
247
+
248
+ merge(left, right, sort_cond)
249
+ end
250
+
251
+ def merge(left, right, sort_cond)
252
+ sorted = []
253
+
254
+ while left.any? && right.any?
255
+
256
+ if sort_cond.call(left.first, right.first) # replace this condition with a proc
257
+ sorted.push right.shift
258
+ else
259
+ sorted.push left.shift
260
+ end
261
+
262
+ end
263
+
264
+ sorted + left + right
265
+ end
266
+
214
267
  end # end class
215
268
  end # module
216
269
  end # end module
@@ -8,13 +8,19 @@ module SknUtils
8
8
  class LinkedList
9
9
  attr_accessor :size
10
10
 
11
- def initialize(*values)
11
+ def initialize(*vargs, &block)
12
+ @sort_condition = nil
12
13
  @current = nil
13
14
  @head = nil
14
15
  @tail = nil
15
16
  @size = 0
16
- values.each {|value| insert(value) }
17
- first if values.size > 1
17
+
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
21
+
22
+ vargs.each {|value| insert(value) }
23
+ first if vargs.size > 1
18
24
  end
19
25
 
20
26
  #
@@ -171,6 +177,24 @@ module SknUtils
171
177
  result
172
178
  end
173
179
 
180
+ # 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 :
183
+ case direction_sym
184
+ when :asc
185
+ @sort_ascending
186
+ when :desc
187
+ @sort_descending
188
+ else
189
+ @sort_condition
190
+ end
191
+
192
+ sorted = merge_sort(to_a, active_sort_condition)
193
+ clear
194
+ sorted.each {|item| insert(item) }
195
+ size
196
+ end
197
+
174
198
  private
175
199
 
176
200
  attr_accessor :head, :tail
@@ -195,6 +219,35 @@ module SknUtils
195
219
  node
196
220
  end
197
221
 
222
+ # Merged Sort via Ref: http://rubyalgorithms.com/merge_sort.html
223
+ # arr is Array to be sorted, sort_cond is Proc expecting a/b params returning true/false
224
+ def merge_sort(arr, sort_cond)
225
+ return arr if arr.size < 2
226
+
227
+ middle = arr.size / 2
228
+
229
+ left = merge_sort(arr[0...middle], sort_cond)
230
+ right = merge_sort(arr[middle..arr.size], sort_cond)
231
+
232
+ merge(left, right, sort_cond)
233
+ end
234
+
235
+ def merge(left, right, sort_cond)
236
+ sorted = []
237
+
238
+ while left.any? && right.any?
239
+
240
+ if sort_cond.call(left.first, right.first) # replace this condition with a proc
241
+ sorted.push right.shift
242
+ else
243
+ sorted.push left.shift
244
+ end
245
+
246
+ end
247
+
248
+ sorted + left + right
249
+ end
250
+
198
251
  end # end class
199
252
  end # end module
200
253
  end # end module
@@ -3,7 +3,7 @@ module SknUtils
3
3
  class Version
4
4
  MAJOR = 3
5
5
  MINOR = 3
6
- PATCH = 1
6
+ PATCH = 2
7
7
 
8
8
  def self.to_s
9
9
  [MAJOR, MINOR, PATCH].join('.')
@@ -236,7 +236,42 @@ RSpec.describe SknUtils::Lists::CircularLinkedList, "Circular LinkedList " do
236
236
  expect(only.nth(1)).to be nil
237
237
  expect(only.nth(-1)).to be nil
238
238
  end
239
+ end
240
+
241
+ context "Sort Feature" do
242
+ let(:num_list) { described_class.new(100, 50, 10, 40, 80, 30, 60, 90, 70, 20, 110) }
243
+ let(:alpha_list) { described_class.new('Z', 'K', 'S', 'n', 's', 'z', 'k', 'N', 'o', 'A') }
244
+ let(:hash_list) { described_class.new({key: 'Z'}, {key: 'K'}, {key: 'S'}, {key: 'n'}, {key: 's'},
245
+ {key: 'z'}, {key: 'k'}, {key: 'N'}, {key: 'o'}, {key: 'A'}
246
+ ) {|a,b| a[:key] >= b[:key] }
247
+ }
239
248
 
249
+ it "#sort! redefines numeric list in asending order" do
250
+ expect(num_list.sort!).to eq(11)
251
+ expect(num_list.to_a).to eq([10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110])
252
+ end
253
+ it "#sort!(:desc) redefines numeric list in descending order" do
254
+ expect(num_list.sort!(:desc)).to eq(11)
255
+ expect(num_list.to_a).to eq([110, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10])
256
+ end
257
+ it "#sort! redefines alpha numeric list in asending order" do
258
+ expect(alpha_list.sort!).to eq(10)
259
+ expect(alpha_list.to_a).to eq(["A", "K", "N", "S", "Z", "k", "n", "o", "s", "z"])
260
+ end
261
+ it "#sort!(:desc) redefines alpha numeric list in descending order" do
262
+ expect(alpha_list.sort!(:desc)).to eq(10)
263
+ expect(alpha_list.to_a).to eq(["z", "s", "o", "n", "k", "Z", "S", "N", "K", "A"])
264
+ end
265
+ it "#sort!() redefines hash object values in default order" do
266
+ expect(hash_list.sort!).to eq(10)
267
+ expect(hash_list.to_a).to eq([{:key=>"A"}, {:key=>"K"}, {:key=>"N"}, {:key=>"S"}, {:key=>"Z"},
268
+ {:key=>"k"}, {:key=>"n"}, {:key=>"o"}, {:key=>"s"}, {:key=>"z"}])
269
+ end
270
+ it "#sort!() lambda overrides sort_condifiton and sorts hash object values in custom order" do
271
+ expect(hash_list.sort!() {|a,b| a[:key] <= b[:key] }).to eq(10)
272
+ expect(hash_list.to_a).to eq([{:key=>"z"}, {:key=>"s"}, {:key=>"o"}, {:key=>"n"}, {:key=>"k"},
273
+ {:key=>"Z"}, {:key=>"S"}, {:key=>"N"}, {:key=>"K"}, {:key=>"A"}])
274
+ end
240
275
  end
241
276
 
242
277
  end
@@ -236,7 +236,42 @@ RSpec.describe SknUtils::Lists::DoublyLinkedList, "Double-Ended LinkedList " do
236
236
  expect(only.nth(1)).to be nil
237
237
  expect(only.nth(-1)).to be nil
238
238
  end
239
+ end
240
+
241
+ context "Sort Feature" do
242
+ let(:num_list) { described_class.new(100, 50, 10, 40, 80, 30, 60, 90, 70, 20, 110) }
243
+ let(:alpha_list) { described_class.new('Z', 'K', 'S', 'n', 's', 'z', 'k', 'N', 'o', 'A') }
244
+ let(:hash_list) { described_class.new({key: 'Z'}, {key: 'K'}, {key: 'S'}, {key: 'n'}, {key: 's'},
245
+ {key: 'z'}, {key: 'k'}, {key: 'N'}, {key: 'o'}, {key: 'A'}
246
+ ) {|a,b| a[:key] >= b[:key] }
247
+ }
239
248
 
249
+ it "#sort! redefines numeric list in asending order" do
250
+ expect(num_list.sort!).to eq(11)
251
+ expect(num_list.to_a).to eq([10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110])
252
+ end
253
+ it "#sort!(:desc) redefines numeric list in descending order" do
254
+ expect(num_list.sort!(:desc)).to eq(11)
255
+ expect(num_list.to_a).to eq([110, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10])
256
+ end
257
+ it "#sort! redefines alpha numeric list in asending order" do
258
+ expect(alpha_list.sort!).to eq(10)
259
+ expect(alpha_list.to_a).to eq(["A", "K", "N", "S", "Z", "k", "n", "o", "s", "z"])
260
+ end
261
+ it "#sort!(:desc) redefines alpha numeric list in descending order" do
262
+ expect(alpha_list.sort!(:desc)).to eq(10)
263
+ expect(alpha_list.to_a).to eq(["z", "s", "o", "n", "k", "Z", "S", "N", "K", "A"])
264
+ end
265
+ it "#sort!() redefines hash object values in default order" do
266
+ expect(hash_list.sort!).to eq(10)
267
+ expect(hash_list.to_a).to eq([{:key=>"A"}, {:key=>"K"}, {:key=>"N"}, {:key=>"S"}, {:key=>"Z"},
268
+ {:key=>"k"}, {:key=>"n"}, {:key=>"o"}, {:key=>"s"}, {:key=>"z"}])
269
+ end
270
+ it "#sort!() lambda overrides sort_condifiton and sorts hash object values in custom order" do
271
+ expect(hash_list.sort!() {|a,b| a[:key] <= b[:key] }).to eq(10)
272
+ expect(hash_list.to_a).to eq([{:key=>"z"}, {:key=>"s"}, {:key=>"o"}, {:key=>"n"}, {:key=>"k"},
273
+ {:key=>"Z"}, {:key=>"S"}, {:key=>"N"}, {:key=>"K"}, {:key=>"A"}])
274
+ end
240
275
  end
241
276
 
242
277
  end
@@ -229,7 +229,42 @@ RSpec.describe SknUtils::Lists::LinkedList, "Singular LinkedList " do
229
229
  expect(only.nth(1)).to be nil
230
230
  expect(only.nth(-1)).to be nil
231
231
  end
232
+ end
233
+
234
+ context "Sort Feature" do
235
+ let(:num_list) { described_class.new(100, 50, 10, 40, 80, 30, 60, 90, 70, 20, 110) }
236
+ let(:alpha_list) { described_class.new('Z', 'K', 'S', 'n', 's', 'z', 'k', 'N', 'o', 'A') }
237
+ let(:hash_list) { described_class.new({key: 'Z'}, {key: 'K'}, {key: 'S'}, {key: 'n'}, {key: 's'},
238
+ {key: 'z'}, {key: 'k'}, {key: 'N'}, {key: 'o'}, {key: 'A'}
239
+ ) {|a,b| a[:key] >= b[:key] }
240
+ }
232
241
 
242
+ it "#sort! redefines numeric list in asending order" do
243
+ expect(num_list.sort!).to eq(11)
244
+ expect(num_list.to_a).to eq([10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110])
245
+ end
246
+ it "#sort!(:desc) redefines numeric list in descending order" do
247
+ expect(num_list.sort!(:desc)).to eq(11)
248
+ expect(num_list.to_a).to eq([110, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10])
249
+ end
250
+ it "#sort! redefines alpha numeric list in asending order" do
251
+ expect(alpha_list.sort!).to eq(10)
252
+ expect(alpha_list.to_a).to eq(["A", "K", "N", "S", "Z", "k", "n", "o", "s", "z"])
253
+ end
254
+ it "#sort!(:desc) redefines alpha numeric list in descending order" do
255
+ expect(alpha_list.sort!(:desc)).to eq(10)
256
+ expect(alpha_list.to_a).to eq(["z", "s", "o", "n", "k", "Z", "S", "N", "K", "A"])
257
+ end
258
+ it "#sort!() redefines hash object values in default order" do
259
+ expect(hash_list.sort!).to eq(10)
260
+ expect(hash_list.to_a).to eq([{:key=>"A"}, {:key=>"K"}, {:key=>"N"}, {:key=>"S"}, {:key=>"Z"},
261
+ {:key=>"k"}, {:key=>"n"}, {:key=>"o"}, {:key=>"s"}, {:key=>"z"}])
262
+ end
263
+ it "#sort!() lambda overrides sort_condifiton and sorts hash object values in custom order" do
264
+ expect(hash_list.sort!() {|a,b| a[:key] <= b[:key] }).to eq(10)
265
+ expect(hash_list.to_a).to eq([{:key=>"z"}, {:key=>"s"}, {:key=>"o"}, {:key=>"n"}, {:key=>"k"},
266
+ {:key=>"Z"}, {:key=>"S"}, {:key=>"N"}, {:key=>"K"}, {:key=>"A"}])
267
+ end
233
268
  end
234
269
 
235
270
  end
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.1
4
+ version: 3.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Scott Jr