class Hyalite::Updates

Attributes

reconcile_transaction[R]

Public Class Methods

new() click to toggle source
# File lib/hyalite/updates.rb, line 42
def initialize
  @dirty_components = []

  @is_batching_updates = false

  @callback_queue = CallbackQueue.new
  @asap_callback_queue = CallbackQueue.new
  @asap_enqueued = false
  @reconcile_transaction = ReconcileTransaction.new

  @flush_transaction = Transaction.new([NestedUpdate.new(@dirty_components), UpdateQueueing.new(@callback_queue), @reconcile_transaction])
end

Public Instance Methods

asap(&callback) click to toggle source
# File lib/hyalite/updates.rb, line 116
def asap(&callback)
  @asap_callback_queue.enqueue(&callback)
  @asap_enqueued = true
end
batched_updates() { || ... } click to toggle source
# File lib/hyalite/updates.rb, line 65
def batched_updates
  already_batching_updates = @is_batching_updates

  @is_batching_updates = true


  if already_batching_updates
    yield
  else
    transaction = Transaction.new do
      flush_batched_updates
      @is_batching_updates = false
    end

    transaction.perform do
      yield
    end
  end
end
enqueue_update(component) click to toggle source
# File lib/hyalite/updates.rb, line 55
def enqueue_update(component)
  unless @is_batching_updates
    batched_updates do
      enqueue_update(component)
    end
  end

  @dirty_components << component
end
flush_batched_updates() click to toggle source
# File lib/hyalite/updates.rb, line 85
def flush_batched_updates
  while @dirty_components.length > 0 || @asap_enqueued
    if @dirty_components.length > 0
      @flush_transaction.perform do |transaction|
        run_batched_updates(transaction)
      end
    end

    if @asap_enqueued
      @asap_enqueued = false
      @asap_callback_queue.notify_all
      next
    end
  end
end
mount_ready() click to toggle source
# File lib/hyalite/updates.rb, line 121
def mount_ready
  @reconcile_transaction.mount_ready
end
run_batched_updates(transaction) click to toggle source
# File lib/hyalite/updates.rb, line 101
def run_batched_updates(transaction)
  @dirty_components.sort{|c1, c2| c1.mount_order <=> c2.mount_order}.each do |component|
    callbacks = component.pending_callbacks
    component.pending_callbacks = nil

    Reconciler.perform_update_if_necessary(component, @reconcile_transaction.mount_ready)

    if callbacks
      callbacks.each do |callback|
        @callback_queue.enqueue(callback)
      end
    end
  end
end