Last active
August 29, 2015 14:17
-
-
Save jhollinger/2d2c09ba63915fcd197c to your computer and use it in GitHub Desktop.
Fun with Enumerator
This file contains 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
require_relative 'libfax' | |
puts "Sending fax..." | |
attempts = mock_fax('555-555-5555', "Here's a fax!") | |
attempts.each_with_index do |status, i| | |
case status | |
when :sent | |
puts "Fax sent!" | |
break | |
when :busy | |
puts "Line busy!" | |
if i < 10 | |
sleep 2 | |
next | |
else | |
puts "Tried 10 times; aborting." | |
break | |
end | |
else | |
puts "Error!" | |
break | |
end | |
end |
This file contains 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
require_relative 'libguess' | |
puts "Let's plan Infinite Questions!" | |
turns = guessing_game | |
turns.each do | |
print "Guess the word: " | |
gets.chomp | |
end | |
puts "You win!" | |
puts "Let's play 20 Questions!" | |
turns = guessing_game | |
won = turns.each_with_index do |_,i| | |
break if i+1 > 20 | |
print "Guess the word: " | |
gets.chomp | |
end | |
puts won ? "You won!" : "You lose :(" |
This file contains 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
# Returns an Enumerator in which each iteration will attempt to send the fax. A status is handed to the caller's "each" block, and it decides how to proceed. | |
# NOTE The domain and API are completely fictitious, but similar enough to some real ones. | |
def fax(number, body) | |
Enumerator.new do |y| | |
# Try (or retry) to send the fax | |
loop do | |
# POST the fax to the API | |
resp = JSON.parse(RestClient.post("https://fax.example.com/api/fax", number: number, body: body)) | |
# Keep polling the status until it's no longer "pending" | |
status = resp['status'].to_sym | |
while status == :pending | |
sleep 2 | |
status = JSON.parse(RestClient.get("https://fax.example.com/api/fax/#{resp['id']}"))['status'].to_sym | |
end | |
# Inform the caller of the final status | |
y << status | |
end | |
end | |
end | |
# A mock implementation of the fax method. This one will actually run, since it doesn't depend on non-existent APIs. | |
def mock_fax(number, body) | |
Enumerator.new do |y| | |
y << :busy | |
y << :busy | |
y << :busy | |
y << :sent | |
end | |
end |
This file contains 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
def guessing_game | |
answer = ANSWERS[rand(ANSWERS.size)] | |
Enumerator.new do |y| | |
guess = nil | |
# Keep yielding to the caller for new guess until one matches | |
until guess == answer | |
guess = y.yield | |
end | |
true | |
end | |
end | |
ANSWERS = %w( | |
rectangle | |
america | |
megaphone | |
monday | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment