# frozen_string_literal: true class Timer attr_reader :started_at, :stopped_at # # Runs the provided block with a timer # # @return [Integer] The elapsed time in seconds # def self.time(&block) timer = new timer.start! yield timer.stop! timer.time_elapsed end def self.start! new.start! end def initialize @started_at = nil @stopped_at = nil end def start! @started_at ||= Time.current self end def stop! return self if @started_at.nil? @stopped_at ||= Time.current time_elapsed end def reset! @started_at = nil @stopped_at = nil self end def started? !started_at.nil? end def finished? !stopped_at.nil? end def time_elapsed return 0 if started_at.nil? (stopped_at || Time.current) - started_at end def to_h { started_at: started_at, stopped_at: stopped_at, time_elapsed: time_elapsed } end end