02d790c4

By: Tom Sydney Kerckhove <syd@cs-syd.eu>

ical-recurrence: implement the sub-daily frequencies

Add hourlyDateTimeRecurrence, minutelyDateTimeRecurrence and
secondlyDateTimeRecurrence, one module each as for the other
frequencies, and drop the catch-all arm that called error.  The case over
Frequency is now exhaustive, so adding one would point here rather than
compiling and throwing at run time.

Each follows the table of which rule parts expand and which limit:

  HOURLY    BYMONTH BYYEARDAY BYMONTHDAY BYDAY BYHOUR limit,
            BYMINUTE BYSECOND expand
  MINUTELY  as above plus BYMINUTE limits, only BYSECOND expands
  SECONDLY  everything limits, nothing expands

BYWEEKNO is N/A for all three.  For SECONDLY there is nothing below a
second to expand into, so an interval holds a single instance and
BYSETPOS can only keep it or drop it.

The stepping is arithmetic on the local time, without reference to any
time zone, which is what these frequencies mean: an hourly rule steps by
an hour on the clock.  Instances that a daylight saving transition makes
nonexistent are dropped by the predicate that recurEvents already passes
in, so that needs nothing here.

byYearDayLimit, byHourLimit, byMinuteLimit and bySecondLimit are new:
BYYEARDAY is only valid for these three frequencies and YEARLY, and the
three time rule parts had only ever been needed in their expanding form.

Suite timing

Time to Start Worker time Duration Time to finish Idle
Config 0s 1s 1s 1s 0s
Eval 1s 11s 11s 13s 0s
Build 12s 5m13s 1m27s 1m40s 0s
Suite 0s 5m27s 1m40s 1m40s 0s

Timeline

0s10s20s30s40s50s1m1m10s1m20s1m30s1m40s