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.
- data/lib/prime_iterator.rb +105 -0
- 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: []
|