module Fugit::Nat::Parser

def _tz(i); alt(:tz, i, :_tz_delta, :_tz_name); end

def _tz(i); alt(:tz, i, :_tz_delta, :_tz_name); end

def _tz_delta(i)

def _tz_delta(i)
  rex(nil, i, /[-+]([01][0-9]|2[0-4]):?(00|15|30|45)/)
end

def _tz_name(i)

def _tz_name(i)
  rex(nil, i, /[A-Z][a-zA-Z0-9+\-]+(\/[A-Z][a-zA-Z0-9+\-_]+){0,2}/)
end

def biz_day(i); rex(:biz_day, i, /(biz|business|week) *day/i); end

def biz_day(i); rex(:biz_day, i, /(biz|business|week) *day/i); end

def datum(i)

def datum(i)
  alt(nil, i,
    :plain_day, :biz_day, :name_day,
    :_tz,
    :flag,
    :duration,
    :name_hour, :numeral_hour, :digital_hour, :simple_hour)
end

def digital_hour(i)

def digital_hour(i)
  rex(:digital_hour, i, /(2[0-4]|[01][0-9]):?[0-5]\d/)
end

def duration(i)

def duration(i)
  rex(
    :duration, i,
    /
      \d+
      \s?
      (mon(ths?)?|d(ays?)?|h(ours?)?|m(in(ute)?s?)?|s(ec(ond)?s?)?)
    /ix)
end

def elt(i); alt(nil, i, :sugar, :datum); end

def elt(i); alt(nil, i, :sugar, :datum); end

def flag(i); rex(:flag, i, /(every|at|after|am|pm|on|in)/i); end

def flag(i); rex(:flag, i, /(every|at|after|am|pm|on|in)/i); end

def name_day(i); rex(:name_day, i, /#{WEEKDAYS.reverse.join('|')}/i); end

def name_day(i); rex(:name_day, i, /#{WEEKDAYS.reverse.join('|')}/i); end

def name_hour(i)

def name_hour(i)
  rex(:name_hour, i, /(#{NHOURS.keys.join('|')})/i)
end

def nat(i); rep(:nat, i, :elt, 1); end

def nat(i); rep(:nat, i, :elt, 1); end

def numeral_hour(i)

def numeral_hour(i)
  rex(:numeral_hour, i, /(#{NUMS.join('|')})/i)
end

def plain_day(i); rex(:plain_day, i, /day/i); end

def plain_day(i); rex(:plain_day, i, /day/i); end

def rewrite_nat(t)

def rewrite_nat(t)
o.pp(t, colours: true)
  t
    .subgather(nil)
    .collect { |tt|
      k = tt.name
      v = tt.string.downcase
      case k
      when :tz
        [ k, [ tt.string.strip, EtOrbi.get_tzone(tt.string.strip) ] ]
      when :duration
        [ k, [ Fugit::Duration.parse(tt.string.strip) ] ]
      when :numeral_hour
        [ k, NUMS.index(v) ]
      when :simple_hour
        [ k, v.to_i ]
      when :digital_hour
        v = v.gsub(/:/, '')
        [ k, [ v[0, 2], v[2, 2] ] ]
      when :name_hour
        [ :digital_hour, NHOURS[v] ]
      when :name_day
        [ k, WEEKDAYS.index(v[0, 3]) ]
      else
        [ k, v ]
      end }
end

def simple_hour(i)

def simple_hour(i)
  rex(:simple_hour, i, /(2[0-4]|[01]?[0-9])/)
end

def sugar(i); rex(nil, i, /(and|or|[, \t]+)/i); end

def sugar(i); rex(nil, i, /(and|or|[, \t]+)/i); end