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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9f10dfc4c9162c2474d86f6961282a02ab528531
4
- data.tar.gz: c569459266e141b396aacec9d1eb03c1b8e6c8c8
3
+ metadata.gz: a858152ce4dbee2e8d75935809054ce1794e4865
4
+ data.tar.gz: 81d7e5210977626a919d06b9f43dee354f44e85c
5
5
  SHA512:
6
- metadata.gz: c03a36fa7b827f1d15b163a1e6729d29b7db4a182047eac5c88ebbcecc8d30528ed37352c33c0f4369aec50c85d83ffd983849c729da647549bc9d8bb4a6218b
7
- data.tar.gz: 430b175bc1d8e700a1ae424fe0eabdd8fbb0fa9cdef2979dd24bec04452d97db954a9d74c97c447ad17e3f1a9ce02a6d7df7e8ed921073e06165958c1265c6d4
6
+ metadata.gz: 31c5cfda536c02ac7a783fc7f9bf45d1bb0f098b5acee96a30ec4312a0121151de5e6886d6d70f0df337f3a09603c634c9fe2ffb11b4283530d3b0c0013dd1a9
7
+ data.tar.gz: fe52c36f44ad71a09e9d5ea5aac0e973f9c6eabf2b15d7f0b19a98495a5933b8ecba476c172a6646cf33f85378b918ee0ccfe2084be04b9393b724bd139c4222
@@ -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('LinkedList Ops') do
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.insert_after(74, x)}
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('Array Ops') do
66
- ary = Array.new(vargs)
67
- adders.each {|x| ary.insert(5, x)}
68
- value = ary.sort!
69
- ary.first
70
- ary.clear
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) === @cmp_proc.call(other_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
- node_request.value
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
- protected()
99
-
100
- def respond_to_missing?(method, include_private=false)
101
- @provider && @provider.protected_methods(true).include?(method) || super
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 method_missing(method, *args, &block)
105
- if @provider and @provider.protected_methods(true).include?(method)
106
- block_given? ? @provider.send(method, *args, block) :
107
- (args.size == 0 ? @provider.send(method) : @provider.send(method, *args))
108
- else
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 = self.head
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.new(value, prior, :single, self, &@match_value)
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.new(value, target, :single, self, &@match_value)
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 and not target.match_by_value(value)
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
@@ -3,7 +3,7 @@ module SknUtils
3
3
  class Version
4
4
  MAJOR = 3
5
5
  MINOR = 3
6
- PATCH = 8
6
+ PATCH = 9
7
7
 
8
8
  def self.to_s
9
9
  [MAJOR, MINOR, PATCH].join('.')
@@ -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: 'o'}, {key: 'A'}
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=>"o"}, {:key=>"s"}, {:key=>"z"}])
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=>"o"}, {:key=>"n"}, {:key=>"k"},
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.8
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-17 00:00:00.000000000 Z
11
+ date: 2017-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: deep_merge