Usage

schedule.at(20.seconds.from_now) { perform_action }
# If you would like the value of that result
# returns value or raises error - a Concurrent::Future
schedule.at(20.seconds.from_now) { perform_action }.get

tick = 0
task = schedule.every(2.milliseconds) { tick += 1; tick }
# Calling get will pause until after the next schedule has run
task.get == 1 # => true
task.get == 2 # => true
task.get == 3 # => true
# It also works as an enumerable
# NOTE:: this will only stop counting once the schedule is canceled
task.each do |count|
puts "The count is #{count}"
task.cancel if count > 5
end