module Kernel
  def promise(&block)
    p = Promise.new

    begin
      result = block.call
      return p.resolve(result) if result
    rescue => e
      return p.reject(e)
    end

    pr = proc do
      begin
        res = block.call
        res ? p.resolve(res) : after(10, &pr)
      rescue => e
        p.reject(e)
      end
    end

    after(10, &pr)
    p
  end

  if RUBY_ENGINE == 'opal'
    def on_browser?; true; end
    def on_desktop?; false; end
    def on_mobile?; false; end
    def on_tablet?; false; end
    def on_tv?; false; end
    def on_server?; false; end

    def after(time_ms, &block)
      `setTimeout(#{block.to_n}, time_ms)`
    end

    # TODO remove before release
    %x{
      Opal.s = function() {
        return Opal.Isomorfeus.store.$get_state().$to_n();
      }
    }
  else
    def on_browser?; false; end
    def on_desktop?; false; end
    def on_mobile?;  false; end
    def on_tablet?;  false; end
    def on_tv?;      false; end
    def on_server?;  true;  end

    def after(time_ms, &block)
      sleep time_ms/1000
      block.call
    end
  end
end