def Date.bywday(year, mon, wday, n = 1, sg=Date::ITALY)
if mon
if mon > 12 || mon == 0 || mon < -12
raise ArgumentError, "mon #{mon} must be 1-12 or negative 1-12"
end
if mon < 0
mon = 13 + mon
end
end
if wday < 0 || wday > 6
raise ArgumentError, 'wday must be in range 0-6, or a weekday name'
end
inc = n <=> 0
if inc == 0
raise ArgumentError, 'n must be greater or less than zero'
end
d = Date.new(year, mon ? mon : inc, inc, sg)
while d.wday != wday
d += inc
end
d += 7 * (n.abs - 1) * inc
if d.year != year
raise ArgumentError, 'n is out of bounds of year'
end
if mon && d.mon != mon
raise ArgumentError, 'n is out of bounds of month'
end
d
end