Friday, September 20, 2024 4:19:54 AM
> settings

Customize


Authenticate

> timers.rb
# frozen_string_literal: true

module ESM
  module Command
    class Base
      class Timers < Hash
        include ActionView::Helpers::NumberHelper

        def initialize(command_name)
          @command_name = command_name
          super
        end

        def reset_all!
          values.each(&:reset!)
        end

        def stop_all!
          values.each(&:stop!)
        end

        def to_h
          transform_values(&:to_h)
        end

        def time!(timer_name, &block)
          timer = create_timer(timer_name)

          timer.start!
          yield
          timer.stop!

          info!(
            timer: timer_name,
            command: @command_name,
            time_elapsed: "#{timer.time_elapsed * 1000} ms"
          )

          nil
        end

        def humanized_total
          time_elapsed = values.sum(&:time_elapsed)

          # Milliseconds
          if (milliseconds = (time_elapsed * 1_000).round) && milliseconds <= 1_000
            return "#{number_with_delimiter(milliseconds)} #{"millisecond".pluralize(milliseconds)}"
          end

          # Microseconds
          if (microseconds = (time_elapsed * 1_000_000).round) && microseconds <= 1_000_000
            return "#{number_with_delimiter(microseconds)} #{"microsecond".pluralize(microseconds)}"
          end

          # Seconds and above
          start_time = values.map(&:started_at).min
          ESM::Time.distance_of_time_in_words(start_time + time_elapsed.seconds, from_time: start_time)
        end

        private

        def create_timer(name)
          name = name.to_sym

          timer = Timer.new

          self[name] = timer
          self.class.define_method(name) { self[name] }

          timer
        end
      end
    end
  end
end
All opinions represented herein are my own
- © 2024 itsthedevman
- build 340fbb8