module ClockFlipPick
ClockFlipPick — choose a display line from stored flip definitions. Public: pick_line, sibling_last_shown Depends: ClockFlipMeaning (sibling_minute), ClockFlipStore Tests: test/lib/clock_flip_pick_test.rb
Constants
- NUMBERED_SENSE
Public Instance Methods
Source
# File lib/clock/flip_pick.rb, line 27 def expand_numbered_senses(picked, pool) picked = picked.to_s match = picked.match(NUMBERED_SENSE) return picked unless match indexed = index_numbered_lines(pool) start_num = match[1].to_i current = indexed[start_num] || picked successor = indexed[start_num + 1] successor ? "#{current} #{successor}" : current end
Source
# File lib/clock/flip_pick.rb, line 39 def index_numbered_lines(lines) Array(lines).each_with_object({}) do |line, hash| sense = line.to_s.match(NUMBERED_SENSE) hash[sense[1].to_i] = line if sense end end
Source
# File lib/clock/flip_pick.rb, line 16 def pick_line(lines:, exclude: [], rng: Random.new) list = Array(lines).map(&:to_s).reject { |line| line.strip.empty? } return nil if list.empty? blocked = Array(exclude).map(&:to_s).reject(&:empty?) choices = list.reject { |line| blocked.include?(line) } choices = list if choices.empty? choices.sample(random: rng) end
Source
# File lib/clock/flip_pick.rb, line 56 def sibling_coordinate(hour, minute) case minute % 10 when 8 then [hour, minute + 1] when 9 then [hour, minute - 1] end end
Source
# File lib/clock/flip_pick.rb, line 47 def sibling_last_shown(hour:, minute:, store: RabbotDb) sibling = sibling_coordinate(hour, minute) return nil unless sibling sibling_hour, sibling_minute = sibling entry = ClockFlipStore.load_entry(hour: sibling_hour, minute: sibling_minute, store: store) entry&.fetch("last_shown", nil) end