Gregorian date-only series. Dates identify occurrences within this series;
applications pair them with their own series ID. They are not POSIX instants.
Native CalendarPattern defaults apply; this is not an RFC text adapter.
Example
A monthly rule anchored on the 31st skips months without that day.
Collect with explicit work and output limits. Limited carries the cursor
to resume; even reaching the exact output capacity does not prove completion.
Read the semantic definition without scanning periods or occurrences.
Immutable selector/exception lists are shared. Reconstruct edits with new;
inclusions and exclusions are already sorted and unique.
O(366*s + n log n) construction, where s is selector count and n is the
number of explicit dates. Each supplied list is limited to 4096 entries.
Validate DTSTART against the whole first period, including BYSETPOS.
Invalid generated dates are skipped; UNTIL is inclusive. COUNT applies
before exclusions; explicit inclusions do not consume or replenish COUNT.
Read one semantic explanation fact by zero-based index; End means the index is past the
declaration’s facts. Does not resolve zones or enumerate occurrences.
Return a bounded diagnostic summary without advancing cursors or enumerating occurrences.
Use typed accessors for application logic; this text is not a storage format.
Stop the generated series by source count or inclusive final date, or leave it unbounded.
Exclusions do not replenish COUNT; explicit inclusions remain outside rule termination.
Calendar candidates, termination, period positions and explicit date additions/exclusions.
Construction checks selector combinations before any query begins.
The exhausted candidate-work, buffer or output budget. Continue from the returned cursor
rather than recreating a recurrence from the last visible date.
One step examines one date, buffered candidate, explicit date, or
period/state boundary. Each step has bounded selector/calendar work.
Buffer capacity counts retained candidates (at most 366); it is not
an allocation-byte claim. Output and immutable input lists are separate.
A zero budget is valid and can return Limited without advancing.
Reducing capacity below an already retained buffer returns BufferLimit
without advancing; Batch.buffered reports that existing retained count.
Shared cursors may copy a period buffer; no scan hides inside one step.
Fold visits ordered, deduplicated dates after exclusions and query
filtering. Stop(value) consumes that date and returns its exact next
cursor, without searching ahead. Stopped never claims completeness.
max_occurrences limits visitor calls; steps account for engine work,
not the caller's visitor. No intermediate output list is constructed.
Resume with the returned cursor and value to preserve the accumulator.
Lazy Roc iterator of bounded batches. Each advance performs one collect;
no series expansion happens while constructing this iterator.
Complete, Limited and errors remain visible items. Iter exhaustion is
transport exhaustion, not proof that the temporal query completed.
Positive work/output limits continue automatically. BufferLimit or a
zero work/output budget emits one terminal Limited item; its cursor can
be resumed explicitly with larger limits. Errors are emitted once.
Retaining chunks/rest iterators can retain their captured buffers.
Return a bounded diagnostic summary without advancing cursors or enumerating occurrences.
Use typed accessors for application logic; this text is not a storage format.