Class: Noder::Events::EventStack

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/noder/events/event_stack.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ EventStack

Returns a new instance of EventStack.



10
11
12
13
# File 'lib/noder/events/event_stack.rb', line 10

def initialize(options={})
  @items = []
  @node_class = options[:node_class] || EMEventNode
end

Instance Attribute Details

#itemsObject (readonly)

Returns the value of attribute items.



6
7
8
# File 'lib/noder/events/event_stack.rb', line 6

def items
  @items
end

Instance Method Details

#call(env = nil) ⇒ Object



44
45
46
47
48
49
50
51
52
# File 'lib/noder/events/event_stack.rb', line 44

def call(env=nil)
  empty_node = @node_class.new({ callback: proc { |env| env } })
  nodes = @items.map { |item| @node_class.new(item) }
  first_node = nodes.reverse.inject(empty_node) do |next_node, current_node|
    current_node.next_node = next_node
    current_node
  end
  first_node.call(env)
end

#index_of_callback(callback) ⇒ Object



40
41
42
# File 'lib/noder/events/event_stack.rb', line 40

def index_of_callback(callback)
  @items.index { |item| item[:callback] == callback }
end

#insert_before(target_callback, item) ⇒ Object



19
20
21
22
23
# File 'lib/noder/events/event_stack.rb', line 19

def insert_before(target_callback, item)
  index = index_of_callback(target_callback)
  raise "Item not found for callback: #{target_callback}" if index.nil?
  @items.insert(index, item)
end

#push(options = {}) ⇒ Object



15
16
17
# File 'lib/noder/events/event_stack.rb', line 15

def push(options={})
  @items << options
end

#remove(target_callback) ⇒ Object



31
32
33
34
# File 'lib/noder/events/event_stack.rb', line 31

def remove(target_callback)
  index = index_of_callback(target_callback)
  @items.delete_at(index) if index
end

#remove_allObject



36
37
38
# File 'lib/noder/events/event_stack.rb', line 36

def remove_all
  @items = []
end

#replace(target_callback, item) ⇒ Object



25
26
27
28
29
# File 'lib/noder/events/event_stack.rb', line 25

def replace(target_callback, item)
  index = index_of_callback(target_callback)
  raise "Item not found for callback: #{target_callback}" if index.nil?
  @items[index] = item
end