linked 0.1.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: eec1f197c1ffec1b6a1e47edc5c2a1c75e0967b3
4
+ data.tar.gz: 826b07b940721256814a4e21613b88d26a485982
5
+ SHA512:
6
+ metadata.gz: a25ecac7d54d74faa3360b2e487287d3875b57633924be4d7f57d0cd9d0ce01ebe86d53dce49fe81db33b2b978fae9296f4f93006a67cf92abd16e145d68341a
7
+ data.tar.gz: 50e9953c0936dc3e2825106c4ce77e14ee161848ec451607a062662c3c7f799b131352e0348189bcfdfb83aacdf07e808c3148079c2a9199b3e8334b38d67675
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.3.0
5
+ before_install: gem install bundler -v 1.12.5
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in linked.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Sebastian Lindberg
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,76 @@
1
+ # Linked
2
+
3
+ [![Build Status](https://travis-ci.org/seblindberg/ruby-linked.svg?branch=master)](https://travis-ci.org/seblindberg/ruby-linked)
4
+ [![Coverage Status](https://coveralls.io/repos/github/seblindberg/ruby-linked/badge.svg?branch=master)](https://coveralls.io/github/seblindberg/ruby-linked?branch=master)
5
+ [![Inline docs](http://inch-ci.org/github/seblindberg/ruby-linked.svg?branch=master)](http://inch-ci.org/github/seblindberg/ruby-linked)
6
+
7
+ Yet another Linked List implementation for Ruby (hence the somewhat awkward name). The library is still under development. The intention is to
8
+
9
+ 1. nail down the functionality,
10
+ 2. start porting the methods over to c and finally
11
+ 3. try to optimize for speed, as much as possible.
12
+
13
+ The project is still in phase 1.
14
+
15
+ ## Installation
16
+
17
+ Add this line to your application's Gemfile:
18
+
19
+ ```ruby
20
+ gem 'linked'
21
+ ```
22
+
23
+ And then execute:
24
+
25
+ $ bundle
26
+
27
+ Or install it yourself as:
28
+
29
+ $ gem install linked
30
+
31
+ ## Usage
32
+
33
+ A basic use case is show below. For more details, for now, see the docs.
34
+
35
+ ```ruby
36
+ require 'linked'
37
+
38
+ # Include the List module in a class
39
+ class ListLike
40
+ include Linked::List
41
+ end
42
+
43
+ # Create a list
44
+ list = ListLike.new
45
+
46
+ # Append values
47
+ list << :value
48
+ list << 'value'
49
+
50
+ # Or create list items manually
51
+ item = Linked::Item.new 42
52
+ list.unshift item
53
+
54
+ # Remove items with #pop and #shift
55
+ list.pop.value # => 'value'
56
+
57
+ # The list behaves much like an Array
58
+ list.count # => 2
59
+ list.map(&:value) # => [42, :value]
60
+ ```
61
+
62
+ ## Development
63
+
64
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
65
+
66
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
67
+
68
+ ## Contributing
69
+
70
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/linked.
71
+
72
+
73
+ ## License
74
+
75
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
76
+
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ end
9
+
10
+ task :default => :test
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "linked"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,313 @@
1
+ module Linked
2
+ # Item
3
+ #
4
+ # This class implements doubly linked list items, designed to work both on
5
+ # their own and as children of list.
6
+ #
7
+ # +- - - + +------+------+ +- - - +
8
+ # | Head | <--| prev | next |--> ... --> | Tail |
9
+ # + - - -+ +------+------+ + - - -+
10
+ # (optional) First Item N Items (optional)
11
+ #
12
+ # An object is considered a list if it responds to #head, #tail, #grow and
13
+ # #shrink. The latter facilitate counting of the items and will be called
14
+ # everytime an item is appended, prepended or deleted. #head and #tail are
15
+ # expected to return two objects that, respectivly
16
+ # a) responds to #next= and #append, or #prev= and #prepend and
17
+ # b) returns true for #nil?.
18
+
19
+ class Item
20
+ # Access the list (if any) that the item belongs to. Writing to this
21
+ # attribute is protected and should be avoided.
22
+ #
23
+ # Returns the item's list, or nil
24
+
25
+ attr_accessor :list
26
+ protected :list=
27
+
28
+ # The Item can hold an arbitrary object as its value and it will stay with
29
+ # the item.
30
+
31
+ attr_accessor :value
32
+
33
+ # Calling either #prev= or #next= directly is not recommended, since can
34
+ # corrupt the chain.
35
+
36
+ attr_writer :prev, :next
37
+ protected :prev=, :next=
38
+
39
+ # Creates a new item. If a list is given the item will be considered a part
40
+ # of that list and appended to the end of it.
41
+ #
42
+ # value - an arbitrary object to store with the item.
43
+ # list - an object responding to #head and #tail.
44
+ #
45
+ # Returns a new Item.
46
+
47
+ def initialize(value = nil, list: nil)
48
+ @value = value
49
+ @list = list
50
+ if list
51
+ list.tail.append self
52
+ else
53
+ @next = nil
54
+ @prev = nil
55
+ end
56
+ end
57
+
58
+ # Check if this is the first item in the list. It is crucial that tail#nil?
59
+ # returns true for the first item to be identified correctly.
60
+ #
61
+ # Returns true if no item come before this one.
62
+
63
+ def first?
64
+ @prev.nil?
65
+ end
66
+
67
+ # Check if this is the last item in the list. It is crucial that head#nil?
68
+ # returns true for the last item to be identified correctly.
69
+ #
70
+ # Returns true if no item come after this one.
71
+
72
+ def last?
73
+ @next.nil?
74
+ end
75
+
76
+ # Access the next item in the list. If this is the last one a StopIteration
77
+ # will be raised, so that items may be iterated over safely in a loop.
78
+ #
79
+ # Example
80
+ # loop do
81
+ # item = item.next
82
+ # end
83
+ #
84
+ # Returns the item that come after this.
85
+
86
+ def next
87
+ raise StopIteration if last?
88
+ @next
89
+ end
90
+
91
+ # Unsafe accessor of the next item in the list. It is preferable to use
92
+ # #next.
93
+ #
94
+ # Returns the item that come after this, or nil if this is the last one.
95
+
96
+ def next!
97
+ @next
98
+ end
99
+
100
+ # Access the previous item in the list. If this is the first one a
101
+ # StopIteration will be raised, so that items may be iterated over safely in
102
+ # a loop.
103
+ #
104
+ # Example
105
+ # loop do
106
+ # item = item.prev
107
+ # end
108
+ #
109
+ # Returns the item that come before this.
110
+
111
+ def prev
112
+ raise StopIteration if first?
113
+ @prev
114
+ end
115
+
116
+ alias previous prev
117
+
118
+ # Unsafe accessor of the previous item in the list. It is preferable to use
119
+ # #prev.
120
+ #
121
+ # Returns the item that come before this, or nil if this is the first one.
122
+
123
+ def prev!
124
+ @prev
125
+ end
126
+
127
+ alias previous! prev!
128
+
129
+ # Split the chain of items in two. If the chain belongs to a list this item
130
+ # and all that stay connected to it will continue to belong to it, while the
131
+ # rest are removed from it.
132
+ #
133
+ # By default all items followng this one will be kept together, but if given
134
+ # the argument after: true, the split will instead happen after this item
135
+ # and it will instead be kept with those before it.
136
+ #
137
+ # Example
138
+ #
139
+ # item_b.split(after: false) => ~item_a~ |> item_b item_c
140
+ # item_b.split(after: true) => item_a item_b <| ~item_c~
141
+ #
142
+ # after - determine wheter to split the chain before or after this item.
143
+ #
144
+ # Returns self.
145
+
146
+ def split after: false
147
+ if after
148
+ unless last?
149
+ if @list
150
+ item = self
151
+ count = 1 + loop.count do
152
+ item = item.next
153
+ item.list = nil
154
+ end
155
+
156
+ tail = @list.tail
157
+ tail.prev = self
158
+ @next = tail
159
+ @list.shrink count
160
+ else
161
+ @next.prev = nil
162
+ @next = nil
163
+ end
164
+ end
165
+ else
166
+ unless first?
167
+ if @list
168
+ item = self
169
+ count = 1 + loop.count do
170
+ item = item.prev
171
+ item.list = nil
172
+ end
173
+
174
+ head = @list.head
175
+ head.next = self
176
+ @prev = head
177
+ @list.shrink count
178
+ else
179
+ @prev.next = nil
180
+ @prev = nil
181
+ end
182
+ end
183
+ end
184
+
185
+ self
186
+ end
187
+
188
+ # Inserts the given item between this one and the one after it (if any). If
189
+ # the given item is part of a chain, all items following it will be moved to
190
+ # this one, and added to the list if one is set.
191
+ #
192
+ # Alternativly the argument can be an arbitrary object, in which case a new
193
+ # item will be created around it.
194
+ #
195
+ # If this item is part of a list #grow will be called on it with the
196
+ # number of added items as an argument. Should it also be the last item
197
+ # #prev= will be called on the list tail.
198
+ #
199
+ # sibling - the item to append, or an arbitrary object to be wraped in a new
200
+ # item.
201
+ #
202
+ # Returns the last item that was appended.
203
+
204
+ def append(sibling)
205
+ if sibling.is_a? Item
206
+ sibling.split
207
+ else
208
+ sibling = self.class.new sibling
209
+ end
210
+
211
+ sibling.prev = self
212
+ after_sibling = @next
213
+ @next = sibling
214
+
215
+ count = 1 + loop.count do
216
+ sibling.list = @list
217
+ sibling = sibling.next
218
+ end
219
+
220
+ @list.send :grow, count if @list
221
+
222
+ sibling.next = after_sibling
223
+ after_sibling.prev = sibling if after_sibling
224
+ sibling
225
+ end
226
+
227
+ # Inserts the given item between this one and the one before it (if any). If
228
+ # the given item is part of a chain, all items preceeding it will be moved
229
+ # to this one, and added to the list if one is set.
230
+ #
231
+ # Alternativly the argument can be an arbitrary object, in which case a new
232
+ # item will be created around it.
233
+ #
234
+ # If this item is part of a list #grow will be called on it with the
235
+ # number of added items as an argument. Should it also be the first item
236
+ # #next= will be called on the list head.
237
+ #
238
+ # sibling - the item to prepend. or an arbitrary object to be wraped in a
239
+ # new item.
240
+ #
241
+ # Returns the last item that was prepended.
242
+
243
+ def prepend(sibling)
244
+ if sibling.is_a? Item
245
+ sibling.split after: true
246
+ else
247
+ sibling = self.class.new sibling
248
+ end
249
+
250
+ sibling.next = self
251
+ before_sibling = @prev
252
+ @prev = sibling
253
+
254
+ count = 1 + loop.count do
255
+ sibling.list = @list
256
+ sibling = sibling.prev
257
+ end
258
+
259
+ @list.send :grow, count if @list
260
+
261
+ sibling.prev = before_sibling
262
+ before_sibling.next = sibling if before_sibling
263
+ sibling
264
+ end
265
+
266
+ # Remove an item from the chain. If this item is part of a list and is
267
+ # either first, last or both in that list, #next= and #prev= will be called
268
+ # on the list head and tail respectivly.
269
+ #
270
+ # If this item is part of a list #shrink will be called on it.
271
+ #
272
+ # Returns self.
273
+
274
+ def delete
275
+ @next.prev = @prev if @next
276
+ @prev.next = @next if @prev
277
+ @list.send :shrink if @list
278
+
279
+ @next = @prev = @list = nil
280
+ self
281
+ end
282
+
283
+ # Iterates over each item before this, in reverse order. If a block is not
284
+ # given an enumerator is returned.
285
+
286
+ def before
287
+ return to_enum(__callee__) unless block_given?
288
+ return if first?
289
+
290
+ item = self.prev
291
+
292
+ loop do
293
+ yield item
294
+ item = item.prev
295
+ end
296
+ end
297
+
298
+ # Iterates over each item after this. If a block is not given an enumerator
299
+ # is returned.
300
+
301
+ def after
302
+ return to_enum(__callee__) unless block_given?
303
+ return if last?
304
+
305
+ item = self.next
306
+
307
+ loop do
308
+ yield item
309
+ item = item.next
310
+ end
311
+ end
312
+ end
313
+ end
@@ -0,0 +1,82 @@
1
+ module Linked
2
+ module List
3
+ # End Of List
4
+ #
5
+ # This class implements a special list item that is placed at both the end
6
+ # and the beginning of a chain of regular items to form a list. The naming
7
+ # (end of list) comes from the fact that this object, by returning true for
8
+ # calls to #nil?, signifies the end of a list of Items. In both directions
9
+ # as a matter of fact, which is why the head and tail objects defined by
10
+ # Item is combined into one.
11
+ #
12
+ # In a nutshell, the structure looks something like this:
13
+ #
14
+ # +-------------------- EOL --------------------+
15
+ # | (head) (tail) |
16
+ # +---------------------------------------------+
17
+ # ^ +-- Item 1 ---+ +-- Item N ---+ ^
18
+ # +-| prev | next |<- ... ->| prev | next |-+
19
+ # +------+------+ +------+------+
20
+
21
+ class EOL < Item
22
+ private :value, :value=, :delete, :first?, :last?
23
+
24
+ def initialize(list:)
25
+ super()
26
+ @list = list
27
+ @prev = @next = self
28
+ end
29
+
30
+ # EOL objects will return true when asked if they are nil. This is
31
+ # foremost an implementation detail to comply with the requirements of the
32
+ # Item class, but also logical in the sense that end-of-list objects are
33
+ # not really part of the list, and should therefore be considered nil.
34
+ #
35
+ # Returns true.
36
+
37
+ def nil?
38
+ true
39
+ end
40
+
41
+ # Inserts one or more items at the end of the list. If the given object is
42
+ # not an Item, or a decendant of Item, it will be treated as a value.
43
+ # Depending on the state of the list the value will be
44
+ # a) wraped in a new instance of Item if the list is empty or
45
+ # b) wraped in an object of the same class as the last item in the list.
46
+ #
47
+ # sibling - the item or value to be appended.
48
+ #
49
+ # Returns the item that was appended. In case of a string of items the
50
+ # last one is returned.
51
+
52
+ def append(sibling)
53
+ if @prev == self
54
+ sibling = Item.new sibling unless sibling.is_a? Item
55
+ super sibling
56
+ else
57
+ @prev.append sibling
58
+ end
59
+ end
60
+
61
+ # Inserts one or more items at the beginning of the list. If the given
62
+ # object is not an Item, or a decendant of Item, it will be treated as a
63
+ # value. Depending on the state of the list the value will be
64
+ # a) wraped in a new instance of Item if the list is empty or
65
+ # b) wraped in an object of the same class as the last item in the list.
66
+ #
67
+ # sibling - the item or value to be prepended.
68
+ #
69
+ # Returns the item that was prepended. In case of a string of items the
70
+ # first one is returned.
71
+
72
+ def prepend(sibling)
73
+ if @next == self
74
+ sibling = Item.new sibling unless sibling.is_a? Item
75
+ super sibling
76
+ else
77
+ @next.prepend sibling
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,204 @@
1
+ module Linked
2
+ # List
3
+ #
4
+ # This module can be included in any class to give it list like behaviour.
5
+ # Most importantly, the methods #head, #tail, #grow and #shrink are
6
+ # implemented to comply with the requirements defined by Item.
7
+ #
8
+ # Example
9
+ #
10
+ # class ListLike
11
+ # include Linked::List
12
+ #
13
+ # def initialize
14
+ # super
15
+ # ...
16
+ #
17
+ # A key implementation detail is the End-Of-List, or EOL object that sits
18
+ # between the list and the actual list items. It provides separation between
19
+ # the list and the actual list items.
20
+
21
+ module List
22
+ include Enumerable
23
+
24
+ # Private accessor method for the End-Of-List object.
25
+ #
26
+ # Returns a List::EOL object.
27
+
28
+ attr_reader :eol
29
+ private :eol
30
+
31
+ # Returns an object that responds to #next= and #prepend.
32
+
33
+ alias head eol
34
+
35
+ # Returns an object that responds to #prev= and #append.
36
+
37
+ alias tail eol
38
+
39
+ # Initializes the list by setting the two instance variable @item_count and
40
+ # @eol. It is important that this method be called during the initialization
41
+ # of the including class, and that the instance variables never be accessed
42
+ # directly.
43
+
44
+ def initialize(*)
45
+ super
46
+
47
+ @eol = EOL.new list: self
48
+ @item_count = 0
49
+ end
50
+
51
+ # Access the first n item(s) in the list.
52
+ #
53
+ # n - the number of items to return.
54
+ #
55
+ # Returns the first item, or an array of items if n > 1.
56
+
57
+ def first(*args)
58
+ if args.empty?
59
+ eol.next!
60
+ else
61
+ super
62
+ end
63
+ end
64
+
65
+ # Access the last n item(s) in the list. When n > 1 the resulting array of
66
+ # items will have their order preserved.
67
+ #
68
+ # When n is zero an empty array will be returned, in order to comply with
69
+ # the behaviour of #first. Negative values will raise an ArgumentError.
70
+ #
71
+ # n - the number of items to return.
72
+ #
73
+ # Returns the last item, or an array of items if n > 1.
74
+
75
+ def last(n = 1)
76
+ if n == 1
77
+ eol.prev!
78
+ else
79
+ raise ArgumentError, 'n cannot be negative' if n < 0
80
+
81
+ n = count if n > count
82
+ res = Array.new n
83
+
84
+ return res if n == 0
85
+
86
+ item = eol.prev!
87
+ loop do
88
+ n -= 1
89
+ res[n] = item
90
+ item = item.prev
91
+ end
92
+
93
+ res
94
+ end
95
+ end
96
+
97
+ # Overrides the Enumerable#count method when given no argument to provide a
98
+ # fast item count. Instead of iterating over each item, the internal item
99
+ # count is returned.
100
+ #
101
+ # args - see Enumerable#count
102
+ #
103
+ # Returns the number of items counted.
104
+
105
+ def count(*args)
106
+ if args.empty? && !block_given?
107
+ @item_count
108
+ else
109
+ super
110
+ end
111
+ end
112
+
113
+ # Returns true if the list does not contain any items.
114
+
115
+ def empty?
116
+ @item_count == 0
117
+ end
118
+
119
+ # Insert an item at the end of the list. If the given object is not an Item,
120
+ # or a decendant of Item, it will be treated as a value. Depending on the
121
+ # state of the list the value will be
122
+ # a) wraped in a new instance of Item if the list is empty or
123
+ # b) wraped in an object of the same class as the last item in the list.
124
+ #
125
+ # item - the item to insert, or an arbitrary value.
126
+ #
127
+ # Returns self.
128
+
129
+ def push(item)
130
+ eol.append item
131
+ self
132
+ end
133
+
134
+ alias << push
135
+
136
+ # Pop the last item off the list.
137
+ #
138
+ # Returns the last item in the list, or nil if the list is empty.
139
+
140
+ def pop
141
+ return nil if empty?
142
+ last.delete
143
+ end
144
+
145
+ # Insert an item at the beginning of the list. If the given object is not an
146
+ # Item, or a decendant of Item, it will be treated as a value. Depending on
147
+ # the state of the list the value will be
148
+ # a) wraped in a new instance of Item if the list is empty or
149
+ # b) wraped in an object of the same class as the last item in the list.
150
+ #
151
+ # item - the item to insert, or an arbitrary value.
152
+ #
153
+ # Returns self.
154
+
155
+ def unshift(item)
156
+ eol.prepend item
157
+ self
158
+ end
159
+
160
+ # Shift the first item off the list.
161
+ #
162
+ # Returns the first item in the list, or nil if the list is empty.
163
+
164
+ def shift
165
+ return nil if empty?
166
+ first.delete
167
+ end
168
+
169
+ # Iterates over each item in the list, either in normal or reverse order. If
170
+ # a block is not given an enumerator is returned.
171
+ #
172
+ # reverse - flips the iteration order if true.
173
+
174
+ def each(reverse: false, &block)
175
+ if reverse
176
+ eol.before(&block)
177
+ else
178
+ eol.after(&block)
179
+ end
180
+ end
181
+
182
+ # Internal method to grow the list with n elements. Never call this method
183
+ # without also inserting the n elements.
184
+ #
185
+ # n - the number of items that has been/will be added to the list.
186
+ #
187
+ # Returns updated the item count.
188
+
189
+ private def grow(n = 1)
190
+ @item_count += n
191
+ end
192
+
193
+ # Internal method to shrink the list with n elements. Never call this method
194
+ # without also deleting the n elements.
195
+ #
196
+ # n - the number of items that has been/will be removed from the list.
197
+ #
198
+ # Returns updated the item count.
199
+
200
+ private def shrink(n = 1)
201
+ @item_count -= n
202
+ end
203
+ end
204
+ end
@@ -0,0 +1,3 @@
1
+ module Linked
2
+ VERSION = '0.1.0'
3
+ end
data/lib/linked.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'linked/version'
2
+ require 'linked/item'
3
+ require 'linked/list/eol'
4
+ require 'linked/list'
5
+
6
+ module Linked
7
+
8
+ end
data/linked.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'linked/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "linked"
8
+ spec.version = Linked::VERSION
9
+ spec.authors = ["Sebastian Lindberg"]
10
+ spec.email = ["seb.lindberg@gmail.com"]
11
+
12
+ spec.summary = %q{Yet another linked list implementation in Ruby.}
13
+ spec.description = %q{Yes, there are a lot of linked list implementaions out there but I wrote my own all the same. This library is ment to be subclassed/included by other objects that that behave like linked lists.}
14
+ spec.homepage = "https://github.com/seblindberg/ruby-linked"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.12"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency "minitest", "~> 5.0"
25
+ spec.add_development_dependency "coveralls", "~> 0.8"
26
+ end
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: linked
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Sebastian Lindberg
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-08-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.12'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.12'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: coveralls
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.8'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.8'
69
+ description: Yes, there are a lot of linked list implementaions out there but I wrote
70
+ my own all the same. This library is ment to be subclassed/included by other objects
71
+ that that behave like linked lists.
72
+ email:
73
+ - seb.lindberg@gmail.com
74
+ executables: []
75
+ extensions: []
76
+ extra_rdoc_files: []
77
+ files:
78
+ - ".gitignore"
79
+ - ".travis.yml"
80
+ - Gemfile
81
+ - LICENSE.txt
82
+ - README.md
83
+ - Rakefile
84
+ - bin/console
85
+ - bin/setup
86
+ - lib/linked.rb
87
+ - lib/linked/item.rb
88
+ - lib/linked/list.rb
89
+ - lib/linked/list/eol.rb
90
+ - lib/linked/version.rb
91
+ - linked.gemspec
92
+ homepage: https://github.com/seblindberg/ruby-linked
93
+ licenses:
94
+ - MIT
95
+ metadata: {}
96
+ post_install_message:
97
+ rdoc_options: []
98
+ require_paths:
99
+ - lib
100
+ required_ruby_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ requirements: []
111
+ rubyforge_project:
112
+ rubygems_version: 2.5.1
113
+ signing_key:
114
+ specification_version: 4
115
+ summary: Yet another linked list implementation in Ruby.
116
+ test_files: []