Class: RawLine::EventLoop
- Inherits:
-
Object
- Object
- RawLine::EventLoop
- Defined in:
- lib/rawline/event_loop.rb
Instance Attribute Summary collapse
-
#events ⇒ Object
readonly
Returns the value of attribute events.
Instance Method Summary collapse
-
#add_event(**event, &blk) ⇒ Object
event looks like: * name * source * target * payload.
- #clear(event_id) ⇒ Object
-
#initialize(registry:) ⇒ EventLoop
constructor
A new instance of EventLoop.
- #once(interval_in_ms:, **event, &blk) ⇒ Object
- #recur(interval_in_ms:, **event, &blk) ⇒ Object
- #reset ⇒ Object
- #start ⇒ Object
- #tick ⇒ Object
Constructor Details
#initialize(registry:) ⇒ EventLoop
Returns a new instance of EventLoop.
5 6 7 8 9 |
# File 'lib/rawline/event_loop.rb', line 5 def initialize(registry:) @registry = registry @events = [] @counter = 0 end |
Instance Attribute Details
#events ⇒ Object (readonly)
Returns the value of attribute events.
3 4 5 |
# File 'lib/rawline/event_loop.rb', line 3 def events @events end |
Instance Method Details
#add_event(**event, &blk) ⇒ Object
event looks like:
* name
* source
* target
* payload
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/rawline/event_loop.rb', line 16 def add_event(**event, &blk) unless event.has_key?(:_event_callback) event[:_event_callback] = blk if blk end unless event.has_key?(:_event_id) @counter += 1 event[:_event_id] = @counter end # if the last event is the same as the incoming then do there is no # need to add it again. For example, rendering events that already # back can be squashed into a single event. if @events.last != event @events << event event[:_event_id] else @events.last[:_event_id] end end |
#clear(event_id) ⇒ Object
37 38 39 |
# File 'lib/rawline/event_loop.rb', line 37 def clear(event_id) @events = @events.reject { |event| event[:_event_id] == event_id } end |
#once(interval_in_ms:, **event, &blk) ⇒ Object
46 47 48 |
# File 'lib/rawline/event_loop.rb', line 46 def once(interval_in_ms:, **event, &blk) add_event event.merge(once: { run_at: recur_at(interval_in_ms) }), &blk end |
#recur(interval_in_ms:, **event, &blk) ⇒ Object
50 51 52 |
# File 'lib/rawline/event_loop.rb', line 50 def recur(interval_in_ms:, **event, &blk) add_event event.merge(recur: { interval_in_ms: interval_in_ms, recur_at: recur_at(interval_in_ms) }), &blk end |
#reset ⇒ Object
41 42 43 44 |
# File 'lib/rawline/event_loop.rb', line 41 def reset @events.clear @counter = 0 end |
#start ⇒ Object
86 87 88 89 90 |
# File 'lib/rawline/event_loop.rb', line 86 def start loop do tick end end |
#tick ⇒ Object
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/rawline/event_loop.rb', line 54 def tick event = @events.shift if event recur = event[:recur] once = event[:once] if recur if current_time_in_ms >= recur[:recur_at] dispatch_event(event) interval_in_ms = recur[:interval_in_ms] add_event event.merge(recur: { interval_in_ms: interval_in_ms, recur_at: recur_at(interval_in_ms) } ) else # put it back on the queue @events << event dispatch_event(default_event) end elsif once if current_time_in_ms >= once[:run_at] dispatch_event(event) else # put it back on the queue @events << event # add_event event dispatch_event(default_event) end else dispatch_event(event) end else dispatch_event(default_event) end end |