prime_iterator 1.0.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.
Files changed (2) hide show
  1. data/lib/prime_iterator.rb +105 -0
  2. metadata +62 -0
@@ -0,0 +1,105 @@
1
+ #
2
+ # Provides API to get next and previous prime number
3
+ #
4
+ # USAGE:
5
+ # iterator = PrimeIterator.new
6
+ # iterator.next # get next prime number, starting from 2
7
+ # iterator.previous # get previous prime number, or nil if previous is called on prime number 2
8
+ # iterator.reset # resets, next will start at 2
9
+ # iterator.batch_size= # sets the number of prime numbers gotten per fetch (which occurs when previous is called at top of list or next is called at end of list)
10
+ #
11
+ require 'prime_finder'
12
+
13
+ class PrimeIterator
14
+
15
+ attr_accessor :batch_size
16
+
17
+ #
18
+ # Init
19
+ #
20
+ def initialize
21
+ @batch_size = 10 # default size is 10
22
+ @current_lower_bound = 2 # 2 is first prime number
23
+ @current_upper_bound = 2 #
24
+ @current_prime_list = Array.new
25
+ @current_prime_list_idx = -1
26
+ end
27
+
28
+ #
29
+ # Get next prime number
30
+ #
31
+ def next
32
+ # if list is empty or index is pointing to end of list, get next batch of prime numbers
33
+ if @current_prime_list.empty? || @current_prime_list_idx == @batch_size-1
34
+ get_next_batch_of_primes
35
+ end
36
+
37
+ @current_prime_list_idx += 1
38
+ @current_prime_list[@current_prime_list_idx]
39
+ end
40
+
41
+ #
42
+ # Get previous prime number
43
+ #
44
+ def previous
45
+ return nil if @current_prime_list.empty?
46
+
47
+ # if at top of list, then get previous batch of prime numbers
48
+ if @current_prime_list_idx == 0
49
+ get_prev_batch_of_primes
50
+ @current_prime_list_idx = @batch_size - 1 # 0 based index
51
+ else
52
+ @current_prime_list_idx -= 1
53
+ end
54
+
55
+ @current_prime_list[@current_prime_list_idx] unless @current_prime_list.empty? # could be empty if previous is called on prime number 2
56
+ end
57
+
58
+ #
59
+ # Reset
60
+ #
61
+ def reset
62
+ initialize
63
+ end
64
+
65
+ private #####
66
+
67
+ #
68
+ # Get next batch of prime numbers
69
+ #
70
+ def get_next_batch_of_primes
71
+ @current_prime_list.clear
72
+
73
+ # keep getting prime numbers until batch size is reached
74
+ begin
75
+ finder = PrimeFinder.new
76
+ @current_prime_list = finder.find_primes @current_lower_bound, @current_upper_bound
77
+ @current_upper_bound += 1
78
+ end until @current_prime_list.size == @batch_size
79
+
80
+ @current_lower_bound = @current_upper_bound
81
+ @current_prime_list_idx = -1 # set to before top of list
82
+ end
83
+
84
+ #
85
+ # Get previous batch of prime numbers
86
+ #
87
+ def get_prev_batch_of_primes
88
+ @current_upper_bound = @current_prime_list[0] - 1 # minus 1 so it doesn't include the current prime number
89
+ @current_prime_list.clear
90
+
91
+ finder = PrimeFinder.new
92
+ previous_prime_batch = finder.find_primes @current_upper_bound
93
+ @current_prime_list = previous_prime_batch.last(@batch_size) # truncate the list to the last BATCH_SIZE number of prime numbers
94
+
95
+ if @current_prime_list.empty?
96
+ # keep previous lower bound
97
+ # set upper bound equal to lower bound
98
+ @current_upper_bound = @current_lower_bound
99
+ else
100
+ # otherwise, set the lower bound to be the first prime number in this batch
101
+ @current_lower_bound = previous_prime_batch.first
102
+ end
103
+ end
104
+
105
+ end
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: prime_iterator
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Robert Chang
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-05-30 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: prime_finder
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 1.0.2
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 1.0.2
30
+ description: Provide API to get next and previous prime number. Uses the prime_finder
31
+ gem.
32
+ email: rchang@fulcrum.net
33
+ executables: []
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - lib/prime_iterator.rb
38
+ homepage: http://rubygems.org/gems/prime_iterator
39
+ licenses: []
40
+ post_install_message:
41
+ rdoc_options: []
42
+ require_paths:
43
+ - lib
44
+ required_ruby_version: !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ! '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ required_rubygems_version: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ requirements: []
57
+ rubyforge_project:
58
+ rubygems_version: 1.8.22
59
+ signing_key:
60
+ specification_version: 3
61
+ summary: Provide API to get next and previous prime number
62
+ test_files: []