require_relative "model/app_model"
require_relative "model/msg"
require_relative "model/event_entry"
require_relative "model/timestamp"
require_relative "model/event_color_cycle"
module Update
extend self
def call(msg, model)
case msg
in Msg::Quit
model
in Msg::NoneEvent
model.with(none_count: model.none_count + 1)
in Msg::Focus(gained:)
event = gained ? RatatuiRuby::Event::FocusGained.new : RatatuiRuby::Event::FocusLost.new
entry = create_entry(event, model)
add_entry(model, entry, :focus).with(focused: gained)
in Msg::Resize(width:, height:, previous_size: _)
event = RatatuiRuby::Event::Resize.new(width:, height:)
entry = create_entry(event, model)
add_entry(model, entry, :resize).with(window_size: [width, height])
in Msg::Input(event:)
entry = create_entry(event, model)
add_entry(model, entry, entry.live_type)
else
model
end
end
def create_entry(event, model)
EventEntry.create(event, model.next_color, Timestamp.now)
end
def add_entry(model, entry, live_type)
new_entries = model.entries + [entry]
new_lit_types = model.lit_types.merge(live_type => Timestamp.now)
new_color_index = (model.color_cycle_index + 1) % EventColorCycle::COLORS.length
model.with(
entries: new_entries,
lit_types: new_lit_types,
color_cycle_index: new_color_index
)
end
end