prime_iterator 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []