Schedules are expressed in terms of wall clock time, and as such have interesting behavior around daylight savings time boundaries. There are two circumstances that might affect a schedule. The first is a repeated time, which occurs when time jumps back (e.g. 2:30 may happen twice in one day). The second is a skipped time, which occurs when time jumps forward by an hour.
In both cases
Schedule does the naive thing. If the time happens twice and is
included in the schedule it is included twice. If it never happens
no special attempt to artificially include it.
In_zone: see the discussion under Zones and Tags above
Tag: see the discussion under Zones and Tags above
Not: correspond to the set operations intersection, union, and complement.
If_then_else (A, B, C): corresponds to (A && B) || (NOT A && C), useful for dealing with schedules that change during certain times of the year (holidays, etc.)
At: the exact times given on every day
Shift: shifts an entire schedule forward or backwards by a known span. (e.g:
Shift ((sec 3.), Secs) = Secs 
Shift ((sec (-3.)), Secs) = Secs )
Between: the contiguous range between the start and end times given on every day
Secs: the exact seconds given during every hour of every day
Mins: all seconds in the minutes given during every hour of every day
Hours: all seconds in the hours given on every day
Weekdays: all seconds in the days given on every week
Days: all seconds in the days given, every month
Weeks: all seconds in the weeks given (numbered ISO 8601), every year
Months: all seconds in the months given, every year
On: all seconds in the exact dates given
Before: all seconds before the given boundary (inclusive or exclusive)
After: all seconds after the given boundary (inclusive or exclusive)
Always: the set of all seconds
Never: the empty set
'a indicates whether the schedule currently has an established zone.
'b is the type of the tag used in this schedule. In many cases it can be
tags for more.
Between (a, b) is the empty set if a > b.
Items that take
int lists silently ignore
ints outside of the viable
Days  will never occur.
| Always : ('a, 'b) t
| Never : ('a, 'b) t
Return a sequence of schedule changes over time that will never end.
If your schedules ends, you will continue to receive `No_change_until_at_least with increasing times forever.
The return type indicates whether
includes t start_time is true and
delivers a sequence of subsequent changes over time.
The times returned by the sequence are strictly increasing and never less
start_time. That is,
`No_change_until_at_least x can never be
`Enter x, only by (at least)
`Enter (x + 1s).
emit is set to
Transitions_and_tag_changes then all changes in tags
will be present in the resulting sequence. Otherwise only the tags in effect
when a schedule is entered are available.
`In_range | `Out_of_range flag in
indicates whether the covered range is entirely within, or outside of the
time covered by the schedule and is only there to help with bookkeeping for
`In_range | `Out_of_range will never disagree with what
could be inferred from the
The sequence takes care to do only a small amount of work between each
element, so that pulling the next element of the sequence is always cheap.
This is the primary motivation behind including
Time.t returned by `No_change_until_at_least is guaranteed to be a reasonable
amount of time in the future (at least 1 hour).
Transitions_and_tag_changes equality for the tag type must be given
next_enter_between t start end The given
end range is inclusive on both
ends. This function is useful for one-off events during the run of a program.
If you want to track changes to a schedule over time it is better to call