Sha256: 2e89427ae16a32935d4f881104cbeb36d47bc4988fa5926721a3a21df4da45df

Contents?: true

Size: 1.61 KB

Versions: 1

Compression:

Stored size: 1.61 KB

Contents

# frozen_string_literal: true

export_default :API

import '../extensions/core'
import '../extensions/fiber'

Exceptions  = import '../core/exceptions'
Supervisor  = import '../core/supervisor'
Throttler   = import '../core/throttler'

# Global API methods to be included in ::Object
module API
  def after(interval, &block)
    spin do
      sleep interval
      block.()
    end
  end

  def cancel_after(interval, &block)
    fiber = ::Fiber.current
    canceller = spin do
      sleep interval
      fiber.schedule Exceptions::Cancel.new
    end
    block.call
  ensure
    canceller.stop
  end

  def spin(&block)
    Fiber.spin(caller, &block)
  end
  alias_method :defer, :spin

  def spin_loop(&block)
    spin { loop(&block) }
  end

  def every(interval)
    timer = Gyro::Timer.new(interval, interval)
    loop do
      timer.await
      yield
    end
  ensure
    timer.stop
  end

  def move_on_after(interval, with_value: nil, &block)
    fiber = ::Fiber.current
    canceller = spin do
      sleep interval
      fiber.schedule Exceptions::MoveOn.new(nil, with_value)
    end
    block.call
  rescue Exceptions::MoveOn => e
    e.value
  ensure
    canceller.stop
  end

  def receive
    Fiber.current.receive
  end

  def sleep(duration = nil)
    return suspend unless duration

    timer = Gyro::Timer.new(duration, 0)
    timer.await
  end

  def supervise(&block)
    Supervisor.new.await(&block)
  end

  def throttled_loop(rarote, count: nil, &block)
    throttler = Throttler.new(rate)
    if count
      count.times { throttler.(&block) }
    else
      loop { throttler.(&block) }
    end
  ensure
    throttler.stop
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
polyphony-0.27 lib/polyphony/core/global_api.rb