linked 0.1.0 → 0.1.1

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: eec1f197c1ffec1b6a1e47edc5c2a1c75e0967b3
4
- data.tar.gz: 826b07b940721256814a4e21613b88d26a485982
3
+ metadata.gz: 513dbae22fea14a370f2181ef4da797264121631
4
+ data.tar.gz: 685eb16cb3380aec648af578118b54416af20772
5
5
  SHA512:
6
- metadata.gz: a25ecac7d54d74faa3360b2e487287d3875b57633924be4d7f57d0cd9d0ce01ebe86d53dce49fe81db33b2b978fae9296f4f93006a67cf92abd16e145d68341a
7
- data.tar.gz: 50e9953c0936dc3e2825106c4ce77e14ee161848ec451607a062662c3c7f799b131352e0348189bcfdfb83aacdf07e808c3148079c2a9199b3e8334b38d67675
6
+ metadata.gz: b3cfa2318674d45841c7a075250cb88d1095a5df6c56a270eda3bf60bce06cd41db8612f1d1df520cd9ab32ded2f73aedb36f71e1fb410c7d875e77f4d128e62
7
+ data.tar.gz: 6557225296323c2ff767766bde4ea13067e39103bc84a9e3fb43229991ca65156373475ad7091412174608c11c4b7bdf889274d96d975e9fee3bd493a1f8aab0
data/lib/linked/item.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Linked
2
4
  # Item
3
5
  #
@@ -54,6 +56,21 @@ module Linked
54
56
  @prev = nil
55
57
  end
56
58
  end
59
+
60
+ # Calling #dup on an item returns a copy that is no longer connected to the
61
+ # original item chain, or the list. The value will also be copied.
62
+ #
63
+ # Returns a new Item.
64
+
65
+ def initialize_dup(source)
66
+ @next = @prev = @list = nil
67
+ @value = begin
68
+ source.value.dup
69
+ rescue TypeError
70
+ source.value
71
+ end
72
+ super
73
+ end
57
74
 
58
75
  # Check if this is the first item in the list. It is crucial that tail#nil?
59
76
  # returns true for the first item to be identified correctly.
@@ -309,5 +326,23 @@ module Linked
309
326
  item = item.next
310
327
  end
311
328
  end
329
+
330
+ # Freezes the value, as well as making the list item itself immutable.
331
+
332
+ def freeze
333
+ value.freeze
334
+ super
335
+ end
336
+
337
+ # The default #inspect method becomes very cluttered the moment you start
338
+ # liking objects together. This implementation fixes that and only shows the
339
+ # class name, object id and value (if set).
340
+
341
+ def inspect
342
+ return yield self if block_given?
343
+
344
+ output = format '%s:0x%0x', self.class.name, object_id
345
+ value ? output + " value=#{value.inspect}" : output
346
+ end
312
347
  end
313
348
  end
data/lib/linked/list.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Linked
2
4
  # List
3
5
  #
@@ -42,10 +44,23 @@ module Linked
42
44
  # directly.
43
45
 
44
46
  def initialize(*)
47
+ @eol = EOL.new list: self
48
+ @item_count = 0
49
+
45
50
  super
46
-
51
+ end
52
+
53
+ # When copying a list its entire item chain needs to be copied as well.
54
+ # Therefore #dup will be called on each of the original lists items, making
55
+ # this operation quite expensive.
56
+
57
+ def initialize_dup(source)
47
58
  @eol = EOL.new list: self
48
59
  @item_count = 0
60
+
61
+ source.each_item { |item| push item.dup }
62
+
63
+ super
49
64
  end
50
65
 
51
66
  # Access the first n item(s) in the list.
@@ -171,13 +186,45 @@ module Linked
171
186
  #
172
187
  # reverse - flips the iteration order if true.
173
188
 
174
- def each(reverse: false, &block)
189
+ def each_item(reverse: false, &block)
175
190
  if reverse
176
191
  eol.before(&block)
177
192
  else
178
193
  eol.after(&block)
179
194
  end
180
195
  end
196
+
197
+ alias each each_item
198
+
199
+ # Calls #freeze on all items in the list, as well as the head and the tail
200
+ # (eol).
201
+
202
+ def freeze
203
+ eol.freeze
204
+ each_item(&:freeze)
205
+ super
206
+ end
207
+
208
+ # Overrides the default inspect method to provide a more useful view of the
209
+ # list.
210
+ #
211
+ # Importantly this implementation supports nested lists and will return a
212
+ # tree like structure.
213
+
214
+ def inspect(&block)
215
+ # Get the parents inspect output
216
+ res = [super]
217
+
218
+ each_item do |item|
219
+ lines = item.inspect(&block).split "\n"
220
+
221
+ res.push (item.last? ? '└─╴' : '├─╴') + lines.shift
222
+ padding = item.last? ? '   ' : '│  '
223
+ lines.each { |line| res.push padding + line }
224
+ end
225
+
226
+ res.join("\n")
227
+ end
181
228
 
182
229
  # Internal method to grow the list with n elements. Never call this method
183
230
  # without also inserting the n elements.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Linked
2
- VERSION = '0.1.0'
4
+ VERSION = '0.1.1'
3
5
  end
data/lib/linked.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'linked/version'
2
4
  require 'linked/item'
3
5
  require 'linked/list/eol'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: linked
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sebastian Lindberg