fibonacci_enumerator 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c742f135126413ac534f27071379c351368ba40b9d7389469403545f22e6dd71
4
+ data.tar.gz: c651cd4a032831917fdaebf754c8e61dc3c03925f74587a0da4aabe6c0f37619
5
+ SHA512:
6
+ metadata.gz: ad938b777156261eace3f66453a217dc6aa806d1ae6e96d7b275b8b9d49b2be3c0d73d58f77e94383536aa8dfd9a5d62a5e270c050ae5aa03790f9cdb24277b5
7
+ data.tar.gz: 7e4cd0b642db9890ba62d26f33ad659110708f64cfbcb982f24f817ab51926adb4789e3bdf2dc4062fadd791f796f5879a431883262fa2f0a4ce91fd696af24f
data/.rubocop.yml ADDED
@@ -0,0 +1,5 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.7
3
+
4
+ inherit_gem:
5
+ rubocop-espago: rubocop.yml
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ ## [Unreleased]
2
+
3
+ ## [0.1.0] - 2023-06-13
4
+
5
+ - Initial release
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 Mateusz Drewniak
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 all
13
+ 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 THE
21
+ SOFTWARE.
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2023 Mateusz Drewniak
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,117 @@
1
+ # FibonacciEnumerator
2
+
3
+ This gems adds `FibonacciEnumerator`, an Enumerable class that makes it possible
4
+ to efficiently calculate elements of the Fibonacci sequence.
5
+
6
+ It is an Enumerable object so it can be iterated through using `each`
7
+ and implements methods like `first`, `select`, `map` etc.
8
+
9
+ ## Installation
10
+
11
+ Install the gem and add to the application's Gemfile by executing:
12
+
13
+ $ bundle add fibonacci_enumerator
14
+
15
+ If bundler is not being used to manage dependencies, install the gem by executing:
16
+
17
+ $ gem install fibonacci_enumerator
18
+
19
+ ## Usage
20
+
21
+ Elements of the Fibonacci sequence are calculated using the dynamic programming approach.
22
+ Instances of `FibonacciEnumerator` contain a cache that accumulates already calculated
23
+ elements of the sequence.
24
+
25
+ You can use the `FibonacciEnumerator` class directly as an `Enumerable` object for convenience.
26
+
27
+ ### at
28
+
29
+ The `at` method aliases as `[]` can be used to get a particular element of the sequence.
30
+
31
+ ```rb
32
+ FibonacciEnumerator.at(1) #=> 1
33
+ FibonacciEnumerator.at(2) #=> 1
34
+ FibonacciEnumerator.at(3) #=> 2
35
+ FibonacciEnumerator.at(4) #=> 3
36
+ FibonacciEnumerator.at(5) #=> 5
37
+ FibonacciEnumerator.at(6) #=> 8
38
+
39
+ FibonacciEnumerator[1] #=> 1
40
+ FibonacciEnumerator[2] #=> 1
41
+ FibonacciEnumerator[3] #=> 2
42
+ FibonacciEnumerator[4] #=> 3
43
+ FibonacciEnumerator[5] #=> 5
44
+ FibonacciEnumerator[6] #=> 8
45
+ ```
46
+
47
+ You can also pass a `Range`.
48
+
49
+ ```rb
50
+ FibonacciEnumerator.at(4..7) #=> [3, 5, 8, 13]
51
+ FibonacciEnumerator[4..7] #=> [3, 5, 8, 13]
52
+ ```
53
+
54
+ ### each
55
+
56
+ You can iterate through the Fibonacci series.
57
+ Keep in mind that it's infinite, so the loop will
58
+ go on forever unless manually interrupted
59
+
60
+ ```rb
61
+ FibonacciEnumerator.each do |element|
62
+ puts element
63
+ end
64
+ # 1
65
+ # 1
66
+ # 2
67
+ # 3
68
+ # 8
69
+ # ...
70
+ ```
71
+
72
+ ### select
73
+
74
+ You can filter elements using `select` or `reject`
75
+
76
+ ```rb
77
+ FibonacciEnumerator.first(25).select(&:even?)
78
+ #=> [0, 2, 8, 34, 144, 610, 2584, 10946, 46368]
79
+ ```
80
+
81
+ This class is `Enumerable` so methods like `each`, `select`, `reject`, `take` etc
82
+ are available as well.
83
+
84
+ ### Sharing the cache between multiple calculations
85
+
86
+ When you want to manually get particular elements of the Fibonacci sequence
87
+ you can save some time by sharing the cache between calculations.
88
+
89
+ You can do that by creating an instance of `FibonacciEnumerator`.
90
+
91
+ ```rb
92
+ fib = FibonacciEnumerator.new
93
+
94
+ fib[10]
95
+ #=> 55
96
+ fib[10] # cache is reused, no calculations were necessary!
97
+ #=> 55
98
+ fib[15] # the first 10 elements were already calculated, so its faster
99
+ #=> 610
100
+ ```
101
+
102
+ Instances are also `Enumerable` objects so methods like `each`, `select`, `reject`, `take` etc
103
+ are available as well.
104
+
105
+ ## Development
106
+
107
+ 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.
108
+
109
+ 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 the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
110
+
111
+ ## Contributing
112
+
113
+ Bug reports and pull requests are welcome on GitHub at https://github.com/Verseth/ruby-fibonacci_enumerator.
114
+
115
+ ## License
116
+
117
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rake/testtask'
5
+
6
+ Rake::TestTask.new(:test) do |t|
7
+ t.libs << 'test'
8
+ t.libs << 'lib'
9
+ t.test_files = FileList['test/**/*_test.rb']
10
+ end
11
+
12
+ require 'rubocop/rake_task'
13
+
14
+ RuboCop::RakeTask.new
15
+
16
+ task default: %i[test rubocop]
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ class FibonacciEnumerator # rubocop:disable Style/StaticClass
4
+ # @return [String]
5
+ VERSION = '0.1.0'
6
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'fibonacci_enumerator/version'
4
+
5
+ # An Enumerable class that makes it possible
6
+ # to efficiently calculate elements of the Fibonacci sequence.
7
+ #
8
+ # It is an Enumerable object so it can be iterated through using `each`
9
+ # and implements methods like `first`, `select`, `map` etc.
10
+ class FibonacciEnumerator
11
+ include ::Enumerable
12
+
13
+ class << self
14
+ alias class_include? include?
15
+
16
+ include ::Enumerable
17
+
18
+ # @param index [Integer, Range]
19
+ def at(index)
20
+ new.at(index)
21
+ end
22
+ alias [] at
23
+
24
+ # @return [Enumerator, self]
25
+ # @yieldparam [Integer]
26
+ def each(&block)
27
+ new.each(&block)
28
+ end
29
+
30
+ alias include? class_include?
31
+ end
32
+
33
+ attr_reader :cache
34
+
35
+ def initialize
36
+ reset_cache
37
+ end
38
+
39
+ # @param index [Integer, Range]
40
+ # @return [Integer]
41
+ def at(index)
42
+ return at_int(index) if index.is_a?(::Integer)
43
+
44
+ at_range(index)
45
+ end
46
+
47
+ # @return [Enumerator, self]
48
+ # @yieldparam [Integer]
49
+ def each
50
+ return enum_for(:each) unless block_given?
51
+
52
+ (0..).each do |i|
53
+ yield at_int(i)
54
+ end
55
+
56
+ self
57
+ end
58
+
59
+ # @return [void]
60
+ def reset_cache
61
+ @cache = [0, 1, 1]
62
+ end
63
+
64
+ private
65
+
66
+ # @param index [Integer]
67
+ # @return [Integer]
68
+ def at_int(index)
69
+ if (item = @cache[index])
70
+ return item
71
+ end
72
+
73
+ while index >= @cache.length # rubocop:disable Style/WhileUntilModifier
74
+ @cache[@cache.length] = @cache[@cache.length - 1] + @cache[@cache.length - 2]
75
+ end
76
+
77
+ @cache[index]
78
+ end
79
+
80
+ # @param range [Range]
81
+ # @return [Integer]
82
+ def at_range(range)
83
+ return @cache[range] if range.end < @cache.length
84
+
85
+ while range.end >= @cache.length # rubocop:disable Style/WhileUntilModifier
86
+ @cache[@cache.length] = @cache[@cache.length - 1] + @cache[@cache.length - 2]
87
+ end
88
+
89
+ @cache[range]
90
+ end
91
+ end
metadata ADDED
@@ -0,0 +1,56 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fibonacci_enumerator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Mateusz Drewniak
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2023-06-13 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A Ruby gem which adds a module that can efficiently calculate the elements
14
+ of the fibonacci sequence.
15
+ email:
16
+ - matmg24@gmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - ".rubocop.yml"
22
+ - CHANGELOG.md
23
+ - LICENSE
24
+ - LICENSE.txt
25
+ - README.md
26
+ - Rakefile
27
+ - lib/fibonacci_enumerator.rb
28
+ - lib/fibonacci_enumerator/version.rb
29
+ homepage: https://github.com/Verseth/ruby-fibonacci_enumerator
30
+ licenses:
31
+ - MIT
32
+ metadata:
33
+ homepage_uri: https://github.com/Verseth/ruby-fibonacci_enumerator
34
+ source_code_uri: https://github.com/Verseth/ruby-fibonacci_enumerator
35
+ rubygems_mfa_required: 'true'
36
+ post_install_message:
37
+ rdoc_options: []
38
+ require_paths:
39
+ - lib
40
+ required_ruby_version: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: 2.7.0
45
+ required_rubygems_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ requirements: []
51
+ rubygems_version: 3.4.14
52
+ signing_key:
53
+ specification_version: 4
54
+ summary: A Ruby gem which adds a module that can efficiently calculate the elements
55
+ of the fibonacci sequence.
56
+ test_files: []