module Fugit::Nat

def do_parse(s)

def do_parse(s)
  parse(s) ||
  fail(ArgumentError.new("could not parse a nat #{s.inspect}"))
end

def parse(s)

def parse(s)
  return s if s.is_a?(Fugit::Cron) || s.is_a?(Fugit::Duration)
  return nil unless s.is_a?(String)
Raabro.pp(Parser.parse(s, debug: 3), colours: true)
  a = Parser.parse(s)
  if a && a.include?([ :flag, 'every' ])
    parse_cron(a)
  else
    nil
  end
end

def parse_cron(a)

def parse_cron(a)
  h = { min: nil, hou: [], dom: [ nil ], mon: [ nil ], dow: [ nil ] }
  a.each do |key, val|
    if key == :biz_day
      h[:dow] = [ [ 1, 5 ] ]
    elsif key == :simple_hour || key == :numeral_hour
      (h[:hou] ||= []) << [ val ]
    elsif key == :digital_hour
      h[:hou] = [ val[0, 1] ]
      h[:min] = [ val[1, 1] ]
    elsif key == :name_day
      (h[:dow] ||= []) << [ val ]
    elsif key == :flag && val == 'pm' && h[:hou]
      h[:hou][-1] =  [ h[:hou][-1].first + 12 ]
    elsif key == :tz
      h[:tz] = val
    elsif key == :duration
      process_duration(h, *val[0].to_h.first)
    end
  end
  h[:min] ||= [ 0 ]
  h[:dow].sort_by! { |d, _| d || 0 }
  Fugit::Cron.allocate.send(:init, nil, h)
end

def process_duration(h, interval, value)

def process_duration(h, interval, value)
  send("process_duration_#{interval}", h, value)
end

def process_duration_day(h, value)

def process_duration_day(h, value)
  h[:hou] = [ 0 ]
  h[:dom] = [ value == 1 ? '*' : "*/#{value}" ]
end

def process_duration_hou(h, value)

def process_duration_hou(h, value)
  h[:hou] = [ value == 1 ? '*' : "*/#{value}" ]
end

def process_duration_min(h, value)

def process_duration_min(h, value)
  h[:hou] = [ '*' ]
  h[:min] = [ value == 1 ? '*' : "*/#{value}" ]
end

def process_duration_mon(h, value)

def process_duration_mon(h, value)
  h[:hou] = [ 0 ]
  h[:dom] = [ 1 ]
  h[:mon] = [ value == 1 ? '*' : "*/#{value}" ]
end

def process_duration_sec(h, value)

def process_duration_sec(h, value)
  h[:hou] = [ '*' ]
  h[:min] = [ '*' ]
  h[:sec] = [ value == 1 ? '*' : "*/#{value}" ]
end