class EventUl::Model

Attributes

events[R]
state[R]

Public Class Methods

event_field(name) click to toggle source
# File lib/event-ul.rb, line 12
def self.event_field(name)
  define_method(name) do
    @state[name]
  end

  define_method("#{name}=") do |value|
    event_data = { name => value }
    dispatch_and_apply(event_data)
  end
end
new() click to toggle source
# File lib/event-ul.rb, line 6
def initialize
  @events = []
  @state = {}
  @current_event = 0
end

Public Instance Methods

current() click to toggle source
# File lib/event-ul.rb, line 23
def current
  @current_event = @events.size

  @state = {}
  @events.each_with_index do |event, step|
    apply(event[:data]) if step <= @current_event
  end

  @state
end
step_back() click to toggle source
# File lib/event-ul.rb, line 34
def step_back
  return @state if @current_event == 0

  @current_event = @current_event - 1

  @state = {}
  @events.each_with_index do |event, step|
    apply(event[:data]) if step <= @current_event
  end

  @state
end

Private Instance Methods

apply(event_data) click to toggle source
# File lib/event-ul.rb, line 59
def apply(event_data)
  @state = @state.merge(event_data)
end
dispatch(event_data) click to toggle source
# File lib/event-ul.rb, line 54
def dispatch(event_data)
  @events.push(at: Time.now, data: event_data)
  @current_event = @events.size
end
dispatch_and_apply(event_data) click to toggle source
# File lib/event-ul.rb, line 49
def dispatch_and_apply(event_data)
  dispatch(event_data)
  apply(event_data)
end