linked-list 0.0.12 → 0.0.16

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
  SHA256:
3
- metadata.gz: 1d11a48bdb387744768bf129513fce5e6f31001988e8cf45bf8b974009938e98
4
- data.tar.gz: 9ba15ea4897065b9a111e6add68d6a60dac5ab61b9e3aba0ab83c7b42e91f8b5
3
+ metadata.gz: dff645cd01380ea68e75dd61a217a9c217a76eb229dc87817caab297444619d7
4
+ data.tar.gz: cbb85a2893c007c17729a3335b9ea9dd65ae9fd6b7f7a83ce4289fa024b21499
5
5
  SHA512:
6
- metadata.gz: 13f2b676935b4b18a9302e9a484f888c9c4730e81cab6fb6a891e4da5cc721fd0adf07d3f62b7a490fe985d32ed6143fdd9e01f586904214824c29c1cc8ed6f6
7
- data.tar.gz: 5f844ebe95b710614b30ebc6a0a732c361987882ea661cc30e3773432f1702c347a2cf8979f63c6b50e6011cdd348adff1f458d0a81d22cab67aaf3b15528c36
6
+ metadata.gz: 8085a108cc3ac4a8edeea3585a0fd0c8adf1639e450d9d6f33e42b8002c3c1d0bd6a4fd6f88ff8b957075b36ff97bf236ed705446f6536ce029ba59c4f16d867
7
+ data.tar.gz: 44feefe384c7420d01bba47b31c9ebc825097d672250b0c0a5a5f1615e2c031678b086631bfab05180da05a560757146657fcfeac30f360163f6b08cd4c43f49
data/.travis.yml CHANGED
@@ -1,7 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.3.0
4
- - 2.5.0
3
+ - 2.7
5
4
  cache: bundler
6
5
  env:
7
6
  CI: true
data/CHANGELOG.md CHANGED
@@ -1,3 +1,41 @@
1
+ # 0.0.x / Unreleased
2
+
3
+ # 0.0.16 / 2021-09-21
4
+
5
+ ## Fixed
6
+
7
+ - Fixed bug when reference to prev node was not set correctly аfter using `shift`.
8
+
9
+ [Compare v0.0.15...v0.0.16](https://github.com/spectator/linked-list/compare/v0.0.15...v0.0.16)
10
+
11
+ # 0.0.15 / 2020-05-26
12
+
13
+ ## Fixed
14
+
15
+ - Fixed bug when deleting the last node of the list. The @tail value was not updated if the @head value was updated.
16
+
17
+ [Compare v0.0.14...v0.0.15](https://github.com/spectator/linked-list/compare/v0.0.14...v0.0.15)
18
+
19
+ # 0.0.14 / 2020-04-17
20
+
21
+ ## Fixed
22
+
23
+ Forced minimal rake version in gemspec to skip rake versions with security issues.
24
+
25
+ [Compare v0.0.13...v0.0.14](https://github.com/spectator/linked-list/compare/v0.0.13...v0.0.14)
26
+
27
+ # 0.0.13 / 2018-11-27
28
+
29
+ ## Fixed
30
+
31
+ - Delete duplicate method definitions (nex3 in [#7](https://github.com/spectator/linked-list/pull/7))
32
+
33
+ ## Added
34
+
35
+ - Allow `List#delete` to delete a `Node` in O(1) time (nex3 in [#6](https://github.com/spectator/linked-list/pull/6))
36
+
37
+ [Compare v0.0.12...v0.0.13](https://github.com/spectator/linked-list/compare/v0.0.12...v0.0.13)
38
+
1
39
  # 0.0.12 / 2018-09-04
2
40
 
3
41
  ## Added
@@ -130,10 +130,19 @@ module LinkedList
130
130
 
131
131
  # Removes first matched node.data from the the list by passed block or value.
132
132
  #
133
+ # If +val+ is a +Node+, removes that node from the list. Behavior is
134
+ # undefined if +val+ is a +Node+ that's not a member of this list.
135
+ #
133
136
  # == Returns:
134
- # Deleted node
137
+ # Deleted node's data
135
138
  #
136
139
  def delete(val = nil, &block)
140
+ if val.respond_to?(:to_node)
141
+ node = val.to_node
142
+ __unlink_node(node)
143
+ return node.data
144
+ end
145
+
137
146
  each_node.find(&__to_matcher(val, &block)).tap do |node_to_delete|
138
147
  return unless node_to_delete
139
148
  __unlink_node(node_to_delete)
@@ -274,61 +283,22 @@ module LinkedList
274
283
  self
275
284
  end
276
285
 
277
- # Inserts data after passed node.
278
- #
279
- # == Returns:
280
- # Inserted node
281
- #
282
- def insert_after_node(data, node)
283
- Node(data).tap do |new_node|
284
- new_node.prev = node
285
- new_node.next = node.next
286
- if node.next
287
- node.next.prev = new_node
288
- else
289
- @tail = new_node
290
- end
291
- node.next = new_node
292
- @length += 1
293
- end
294
- end
295
-
296
-
297
- # Inserts data before passed node.
298
- #
299
- # == Returns:
300
- # Inserted node
301
- #
302
- def insert_before_node(data, node)
303
- Node(data).tap do |new_node|
304
- new_node.next = node
305
- new_node.prev = node.prev
306
- if node.prev
307
- node.prev.next = new_node
308
- else
309
- @head = new_node
310
- end
311
- node.prev = new_node
312
- @length += 1
313
- end
314
- end
315
-
316
286
  private
317
287
 
318
288
  def __unlink_node(node)
289
+ @head = node.next if node.prev.nil?
290
+ @tail = node.prev if node.next.nil?
291
+
319
292
  if node.prev.nil?
320
293
  node.next.prev = nil if node.next
321
- @head = node.next
322
294
  elsif node.next.nil?
323
295
  node.prev.next = nil if node.prev
324
- @tail = node.prev
325
296
  else
326
297
  node.prev.next, node.next.prev = node.next, node.prev
327
298
  end
328
299
  @length -= 1
329
300
  end
330
301
 
331
-
332
302
  def __to_matcher(val = nil, &block)
333
303
  raise ArgumentError, 'either value or block should be passed' if val && block_given?
334
304
  block = ->(e) { e == val } unless block_given?
@@ -338,7 +308,7 @@ module LinkedList
338
308
  def __shift
339
309
  head = @head
340
310
  @head = @head.next
341
- head.next = nil
311
+ @head.prev = nil if @head
342
312
  head
343
313
  end
344
314
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Linked
4
4
  module List
5
- VERSION = '0.0.12'
5
+ VERSION = '0.0.16'
6
6
  end
7
7
  end
data/linked-list.gemspec CHANGED
@@ -18,9 +18,9 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_development_dependency 'bundler', '>= 1.3', '<= 2.0'
21
+ spec.add_development_dependency 'bundler', '>= 2.0', '< 3.0'
22
22
  spec.add_development_dependency 'coveralls', '~> 0'
23
23
  spec.add_development_dependency 'm', '~> 1.5', '>= 1.5.0'
24
24
  spec.add_development_dependency 'minitest', '>= 5.0', '<= 6.0'
25
- spec.add_development_dependency 'rake', '~> 0'
25
+ spec.add_development_dependency 'rake', '>= 12.3.3'
26
26
  end
data/test/list_test.rb CHANGED
@@ -4,6 +4,7 @@ describe LinkedList::List do
4
4
  let(:list) { create_list }
5
5
  let(:node_1) { create_node('foo') }
6
6
  let(:node_2) { create_node('bar') }
7
+ let(:node_3) { create_node('baz') }
7
8
 
8
9
  describe 'instantiation' do
9
10
  it 'assigns first to nil' do
@@ -476,6 +477,75 @@ describe LinkedList::List do
476
477
  end
477
478
  end
478
479
  end
480
+
481
+ describe 'by node' do
482
+ it 'deletes first node' do
483
+ list.push(node_1)
484
+ list.push(node_2)
485
+ list.push(node_3)
486
+ list.delete(node_1)
487
+ assert_equal ['bar', 'baz'], list.to_a
488
+ end
489
+
490
+ it 'returns deleted value' do
491
+ list.push(node_1)
492
+ list.delete(node_1)
493
+ assert_equal node_1.data, list.delete(node_1)
494
+ end
495
+
496
+ it 'decreases length of list' do
497
+ list.push('foo')
498
+ list.push('bar')
499
+ list.push('baz')
500
+ list.delete('foo')
501
+ assert_equal 2, list.length
502
+ end
503
+
504
+ describe 'position edge cases' do
505
+ before do
506
+ list.push(node_1)
507
+ list.push(node_2)
508
+ list.push(node_3)
509
+ end
510
+
511
+ it 'deletes value from head' do
512
+ list.delete(node_1)
513
+ assert_equal [node_2.data, node_3.data], list.to_a
514
+ assert_equal node_2.data, list.first
515
+ assert_equal node_3.data, list.last
516
+ end
517
+
518
+ it 'deletes value from middle' do
519
+ list.delete(node_2)
520
+ assert_equal [node_1.data, node_3.data], list.to_a
521
+ assert_equal node_1.data, list.first
522
+ assert_equal node_3.data, list.last
523
+ end
524
+
525
+
526
+ it 'deletes value from tail' do
527
+ list.delete(node_3)
528
+ assert_equal [node_1.data, node_2.data], list.to_a
529
+ assert_equal node_1.data, list.first
530
+ assert_equal node_2.data, list.last
531
+ end
532
+ end
533
+
534
+ describe 'delete edge cases' do
535
+ it 'resets original list state when deleting the last node of the list' do
536
+ assert_nil list.first
537
+ assert_nil list.last
538
+
539
+ list.push(node_1)
540
+ assert_equal node_1.data, list.first
541
+ assert_equal node_1.data, list.last
542
+
543
+ list.delete(node_1)
544
+ assert_nil list.first
545
+ assert_nil list.last
546
+ end
547
+ end
548
+ end
479
549
  end
480
550
 
481
551
  describe '#delete_all' do
@@ -568,6 +638,16 @@ describe LinkedList::List do
568
638
  assert_nil list.first
569
639
  end
570
640
 
641
+ it 'sets reference to the prev node' do
642
+ list.push(node_1)
643
+ list.push(node_2)
644
+ assert_nil node_1.prev
645
+ assert_equal node_2.prev, node_1
646
+
647
+ list.shift
648
+ assert_nil node_2.prev
649
+ end
650
+
571
651
  it 'reduces list length by 1' do
572
652
  list.push(node_1)
573
653
  list.shift
metadata CHANGED
@@ -1,35 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: linked-list
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yury Velikanau
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-09-05 00:00:00.000000000 Z
11
+ date: 2021-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '1.3'
20
- - - "<="
21
18
  - !ruby/object:Gem::Version
22
19
  version: '2.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '3.0'
23
23
  type: :development
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - ">="
28
- - !ruby/object:Gem::Version
29
- version: '1.3'
30
- - - "<="
31
28
  - !ruby/object:Gem::Version
32
29
  version: '2.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '3.0'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: coveralls
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -88,16 +88,16 @@ dependencies:
88
88
  name: rake
89
89
  requirement: !ruby/object:Gem::Requirement
90
90
  requirements:
91
- - - "~>"
91
+ - - ">="
92
92
  - !ruby/object:Gem::Version
93
- version: '0'
93
+ version: 12.3.3
94
94
  type: :development
95
95
  prerelease: false
96
96
  version_requirements: !ruby/object:Gem::Requirement
97
97
  requirements:
98
- - - "~>"
98
+ - - ">="
99
99
  - !ruby/object:Gem::Version
100
- version: '0'
100
+ version: 12.3.3
101
101
  description: Ruby implementation of Doubly Linked List, following some Ruby idioms.
102
102
  email:
103
103
  - yury.velikanau@gmail.com
@@ -130,7 +130,7 @@ homepage: https://github.com/spectator/linked-list
130
130
  licenses:
131
131
  - MIT
132
132
  metadata: {}
133
- post_install_message:
133
+ post_install_message:
134
134
  rdoc_options: []
135
135
  require_paths:
136
136
  - lib
@@ -145,9 +145,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
145
145
  - !ruby/object:Gem::Version
146
146
  version: '0'
147
147
  requirements: []
148
- rubyforge_project:
149
- rubygems_version: 2.7.6
150
- signing_key:
148
+ rubygems_version: 3.1.2
149
+ signing_key:
151
150
  specification_version: 4
152
151
  summary: Ruby implementation of Doubly Linked List, following some Ruby idioms.
153
152
  test_files: