graph LR
Clock-->Driver
Driver-->Printer
Driver-->Logger
Last active
September 25, 2023 21:04
-
-
Save djmetzle/20a96b2445f0dfb06fafe665a89d3add to your computer and use it in GitHub Desktop.
Ractor Play
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
UNITS = { | |
second: :sec, | |
minute: :min, | |
hour: :hour, | |
day: :mday, | |
month: :month, | |
year: :year, | |
}.freeze | |
def secondClock | |
return Ractor.new name: 'clock' do | |
values = {} | |
UNITS.each_key do |unit| | |
values[unit] = nil | |
end | |
loop do | |
sleep 0.1 | |
now = Time.now | |
UNITS.keys.reverse.each do |unit| | |
current_unit_value = now.send(UNITS[unit]) | |
if values[unit] != current_unit_value | |
values[unit] = current_unit_value | |
Ractor.yield ({event: unit, time: now}).freeze | |
end | |
end | |
end | |
end | |
end | |
def driver(clock, *ractors) | |
return Ractor.new(clock, ractors, name: 'driver') do |clock, ractors| | |
loop do | |
event = clock.take | |
ractors.each { |r| r.send(event) } | |
end | |
end | |
end | |
def eventPrinter | |
return Ractor.new(name: 'printer') do | |
loop do | |
event = Ractor.receive | |
puts event[:event].to_s + ": " + event[:time].to_a.to_s | |
end | |
end | |
end | |
def eventLogger | |
return Ractor.new(name: 'logger') do | |
File.delete('./clock.log') | |
loop do | |
event = Ractor.receive | |
log_entry = event[:event].to_s + ": " + event[:time].to_s + "\n" | |
File.open('./clock.log', 'a') do |log| | |
log.write(log_entry) | |
end | |
end | |
end | |
end | |
clock = secondClock | |
printer = eventPrinter | |
logger = eventLogger | |
driver = driver(clock, printer, logger) | |
Ractor.select(driver) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment