module ActiveJob::Exceptions

def determine_delay(seconds_or_duration_or_algorithm:, executions:, jitter: JITTER_DEFAULT)

def determine_delay(seconds_or_duration_or_algorithm:, executions:, jitter: JITTER_DEFAULT)
  jitter = jitter == JITTER_DEFAULT ? self.class.retry_jitter : (jitter || 0.0)
  case seconds_or_duration_or_algorithm
  when :exponentially_longer
    delay = executions**4
    delay_jitter = determine_jitter_for_delay(delay, jitter)
    delay + delay_jitter + 2
  when ActiveSupport::Duration, Integer
    delay = seconds_or_duration_or_algorithm.to_i
    delay_jitter = determine_jitter_for_delay(delay, jitter)
    delay + delay_jitter
  when Proc
    algorithm = seconds_or_duration_or_algorithm
    algorithm.call(executions)
  else
    raise "Couldn't determine a delay based on #{seconds_or_duration_or_algorithm.inspect}"
  end
end