/**
 * A period is defined by its start date (inclusive),
 * its end date (exclusive) and related data.
 */
export interface Period<T> {
    /** Beginning of this period, inclusive */
    start: Date;
    /** End of this period, exclusive */
    end: Date;
    /** Data related to this period */
    data: T;
}
/**
 * A Schedule is a temporally-ordered collection of discrete,
 * non-overlapping periods. A schedule contains at least one
 * period.
 */
export type Schedule<T> = [first: Period<T>, ...rest: Period<T>[]];
/**
 * A MaybeSchdule is a temporally-ordered collection of discrete,
 * non-overlapping periods. Contrary to a Schedule, a MaybeSchedule
 * can be empty, i.e. it can contain zero periods.
 */
export type MaybeSchedule<T> = Period<T>[];
/**
 * Data cloning functions are used by other functions in this module to create
 * identical copies of period's data. A data cloning function **must** return a
 * deep copy of the provided value.
 */
export type CloneDataFn<T> = (data: T) => T;
/**
 * Data merging functions are used by other functions in this module to merge
 * the data of two different periods into a new data value for a new period.
 */
export type MergeDataFn<T> = (left: T, right: T) => T;
/**
 * Returns the first (and only) period in the schedule which covers the time
 * instant represented by the provided date. Returns undefined if the schedule
 * does not contain one such period.
 */
export declare const getPeriodForDate: <T>(schedule: MaybeSchedule<T>, value: Date) => Period<T> | undefined;
/**
 * Merges two schedules together. Overlapping periods will be broken down into
 * shorter periods. The cloning and merging functions will be called to create
 * the resulting periods and may be used to customize the merging logic in the
 * case of partially or completely overlapping periods.
 */
export declare const merge: <T>(left: MaybeSchedule<T>, right: MaybeSchedule<T>, cloner: CloneDataFn<T>, merger: MergeDataFn<T>) => MaybeSchedule<T>;
/**
 * Fills empty gaps in a schedule with new periods built upon the provided
 * `defaults` data object.
 */
export declare const fillGaps: <T>(schedule: MaybeSchedule<T>, start: Date, end: Date, getPeriodData: (start: Date, end: Date) => T) => Schedule<T>;
