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 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