module Kernel

Meta-programming Kernel for Syntactic Sugars

Public Instance Methods

async(method) { |*args| ... } click to toggle source

Define an async method @param [Symbol] method method name @yield async method @example

async :hello do 
  puts 'Hello'
end
# File lib/murasaki/promise.rb, line 41
def async(method)
  define_singleton_method method do |*args|
    async_fiber(Fiber.new {yield(*args)})
  end
end
async_fiber(fiber) click to toggle source

Make fiber as async chain @param [Fiber] fiber root of async chain

# File lib/murasaki/promise.rb, line 24
def async_fiber(fiber)
  chain = proc do |result|
    next unless result.is_a? Promise
    result.then do |val|
      chain.call(fiber.resume(val))
    end
  end
  chain.call(fiber.resume)
end
await(promise) click to toggle source

Block the I/O to wait for async method response @param [Promise] promise promise method @example

result = await SQL.query('SELECT * FROM hello')
# File lib/murasaki/promise.rb, line 51
def await(promise)
  result = Fiber.yield promise
  if result.is_a? PromiseException
    raise result.payload
  end
  result
end