class Fugit::Cron

def range(min, max, sta, edn, sla)

def range(min, max, sta, edn, sla)
  return [ nil ] if sta == min && edn == max && sla == 1
  fail ArgumentError.new(
    'both start and end must be negative in ' +
    { min: min, max: max, sta: sta, edn: edn, sla: sla }.inspect
  ) if (sta < 0 && edn > 0) || (edn < 0 && sta > 0)
  a = []
  omin, omax = min, max
  min, max = -max, -1 if sta < 0
  cur = sta
  loop do
    a << cur
    break if cur == edn
    cur += 1
    if cur > max
      cur = min
      edn = edn - max - 1 if edn > max
    end
    fail RuntimeError.new(
      "too many loops for " +
      { min: omin, max: omax, sta: sta, edn: edn, sla: sla }.inspect +
      " #range, breaking, " +
      "please fill an issue at https://git.io/fjJC9"
    ) if a.length > 2 * omax
      # there is a #uniq afterwards, hence the 2* for 0-24 and friends
  end
  a.each_with_index
    .select { |e, i| i % sla == 0 }
    .collect(&:first)
    .uniq
end