Module: Ibex::Runtime::Observation

Included in:
Parser
Defined in:
lib/ibex/runtime/observation.rb,
sig/ibex/runtime/observation.rbs

Overview

Registration and ordered synchronous dispatch for parser observers.

Defined Under Namespace

Classes: Subscription

Instance Method Summary collapse

Instance Method Details

#emit_runtime_event(type, data, observers: runtime_observer_snapshot) ⇒ void

This method returns an undefined value.

RBS:

  • (Symbol type, Hash[untyped, untyped] data, ?observers: Array[Proc]?) -> void

Parameters:

  • type (Symbol)
  • data (Hash[untyped, untyped])
  • observers: (Array[Proc], nil) (defaults to: runtime_observer_snapshot)


61
62
63
64
65
66
67
# File 'lib/ibex/runtime/observation.rb', line 61

def emit_runtime_event(type, data, observers: runtime_observer_snapshot)
  return unless observers

  @runtime_event_sequence += 1
  event = Event.new(type: type, sequence: @runtime_event_sequence, data: data)
  observers.each { |observer| observer.call(event) }
end

#ensure_observation_thread!void

This method returns an undefined value.

RBS:

  • () -> void



75
76
77
78
79
# File 'lib/ibex/runtime/observation.rb', line 75

def ensure_observation_thread!
  return if @driver_status == :idle || @runtime_driver_thread == Thread.current

  raise ThreadError, "parser observers cannot be changed from another thread while a driver is active"
end

#observe {|arg0| ... } ⇒ Subscription

RBS:

  • () { (Event) -> void } -> Subscription

Yields:

Yield Parameters:

Yield Returns:

  • (void)

Returns:



30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/ibex/runtime/observation.rb', line 30

def observe(&observer)
  __send__(:ensure_runtime_initialized!)
  raise ArgumentError, "observe requires a block" unless observer

  @runtime_observation_mutex.synchronize do
    ensure_observation_thread!
    @runtime_fast_path = false
    subscription = Subscription.__send__(:new)
    @runtime_observers ||= {} #: Hash[Subscription, Proc]
    @runtime_observers[subscription] = observer
    subscription
  end
end

#runtime_observer_snapshotArray[Proc]?

RBS:

  • () -> Array[Proc]?

Returns:

  • (Array[Proc], nil)


70
71
72
# File 'lib/ibex/runtime/observation.rb', line 70

def runtime_observer_snapshot
  @runtime_observers&.values
end

#unobserve(subscription) ⇒ Boolean

RBS:

  • (Subscription subscription) -> bool

Parameters:

Returns:

  • (Boolean)


45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/ibex/runtime/observation.rb', line 45

def unobserve(subscription)
  __send__(:ensure_runtime_initialized!)
  @runtime_observation_mutex.synchronize do
    ensure_observation_thread!
    observers = @runtime_observers
    next false unless observers

    removed = !observers.delete(subscription).nil?
    @runtime_observers = nil if observers.empty?
    removed
  end
end