Created
October 19, 2012 15:00
-
-
Save shostakovich/3918674 to your computer and use it in GitHub Desktop.
prime.rb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class PseudoPrimeGenerator | |
include Enumerable | |
def initialize(ubound = nil) | |
@ubound = ubound | |
end | |
def upper_bound=(ubound) | |
@ubound = ubound | |
end | |
def upper_bound | |
@ubound | |
end | |
# returns the next pseudo-prime number, and move the internal | |
# position forward. | |
# | |
# +PseudoPrimeGenerator+#succ raises +NotImplementedError+. | |
def succ | |
raise NotImplementedError, "need to define `succ'" | |
end | |
# alias of +succ+. | |
def next | |
raise NotImplementedError, "need to define `next'" | |
end | |
# Rewinds the internal position for enumeration. | |
# | |
# See +Enumerator+#rewind. | |
def rewind | |
raise NotImplementedError, "need to define `rewind'" | |
end | |
# Iterates the given block for each prime numbers. | |
def each(&block) | |
return self.dup unless block | |
if @ubound | |
last_value = nil | |
loop do | |
prime = succ | |
break last_value if prime > @ubound | |
last_value = block.call(prime) | |
end | |
else | |
loop do | |
block.call(succ) | |
end | |
end | |
end | |
# see +Enumerator+#with_index. | |
alias with_index each_with_index | |
# see +Enumerator+#with_object. | |
def with_object(obj) | |
return enum_for(:with_object) unless block_given? | |
each do |prime| | |
yield prime, obj | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment