import { DayOfWeekNum, TimePoint } from "./time-type";
declare abstract class Head {
    nextRule?: Tail;
    /**
     * 设置 Head 对象连接的 Tail
     * @param rule 可以连接到 Head 对象后面的 Tail 对象
     */
    setNextRule(rule: Tail): void;
    /**
     * 生成下一个时间，用 Date 对象表示，保证返回的 Date 对象表示的时间点在当前时间之后，在 leftBoudar 之后
     * @param leftBoundary 上一个时间点，或时间左界，如果类型为 number，则为毫秒表示的时间戳
     */
    abstract generateNextTime(leftBoundary: number | Date): Date;
}
interface Tail {
    /**
     * 调整 Date 对象表示的时间，使其落在合适的范围内
     * @param dt 被调整的 Date 对象
     * @param keepPoint 是否保持时间点（时分秒）不变
     */
    adjustTime(dt: Date, keepPoint: boolean): Date;
}
/**
 * 固定时间点规则，例如每天的 21:30，周六的 22:00
 */
declare class TimePointRule extends Head {
    private points;
    constructor(points: TimePoint | TimePoint[]);
    addPoint(point: TimePoint): this;
    addPoints(points: TimePoint[]): this;
    /**
     * 根据上一个时间点计算出下一个合法的时间点
     * @param leftBoundary 上一个时间点
     * @returns 下一个合法的时间点，下一个时间点和上一个时间点可能时分秒相同但个属于不同的天，也可能属于同一天，但是时分秒不同
     */
    generateNextTime(leftBoundary: number | Date): Date;
}
/**
 * 天级时间范围规则，例如周一至周五，周六，周天
 */
declare class DayRangeRule implements Tail {
    /**
     * 包含 7 个 boolean 值的数组，包含某天则对应的列表元素为 true，不包括则为 false
     */
    private days;
    /**
     * @param _default 一周7天，每天是否默认，true 表示包括，false 表示不包括
     */
    constructor(_default: boolean);
    addDays(...days: DayOfWeekNum[]): void;
    excludeDays(...days: DayOfWeekNum[]): void;
    /**
     * 如果需要，调整时间对象 dt，使其落在本规则规定的天内
     * @param dt 需要被调整的时间
     * @param keepPoint 是否保持之前的时分秒，如果 true，则调整过程不会改变时分秒，只会改变天
     * @returns 被调整后的时间，可能等于被调整的时间
     */
    adjustTime(dt: Date, keepPoint?: boolean): Date;
}
/**
 * 小时级时间范围规则，分为所在范围，和排除范围
 */
declare class HourRangeRule implements Tail {
    private includeOrExclude;
    private rangeArrays;
    constructor(includeOrExclude: boolean);
    /**
     * 添加时间段
     * @param range 时间段，由两个 TimePoint 组成
     * @param daysOfWeek 时间段所在天
     */
    addRange(range: [TimePoint, TimePoint], ...daysOfWeek: DayOfWeekNum[]): void;
    /**
     * 将时间段添加到同属于某天(DayOfWeekNum)的列表
     * @param range 时间段，由两个 TimePoint 组成
     * @param day 时间段所在的天
     */
    private _addRangeToOneDay;
    /**
     * 调整时间 dt，使其落在本规则规定的时间范围内
     * @param dt 被调整的时间
     * @returns 调整后的时间
     */
    adjustTime(dt: Date): Date;
}
/**
 * 频率规则，例如没多少天，多少小时，多少分钟，多少秒
 */
declare class Frequency extends Head {
    count: number;
    unitDuration: number;
    /**
     *
     * @param count 多少个时间单位
     * @param unitDuration 每个时间单位的时长（秒数）
     */
    constructor(count: number, unitDuration: number);
    /**
     * 根据上一个时间、本规则规定频率以及当前时间产生下一个时间，但是保证产生的时间为未来时间
     * @param lastTime 上一个时间
     * @returns 根据上一个时间和本频率规则计算出的下一个时间
     */
    generateNextTime(lastTime: number | Date): Date;
}
declare class SecondFrequency extends Frequency {
    constructor(count: number);
}
declare class MinuteFrequency extends Frequency {
    constructor(count?: number);
}
declare class HourFrequency extends Frequency {
    constructor(count?: number);
}
declare class DayFrequency extends Frequency {
    constructor(count?: number);
}
/**
 * 规则链
 * 内部至少包含一个 HeadRule 对象，该 HeadRule 可选的连接一个 TailRule 对象。
 * 未来随着规则越来越复杂，一个规则链内部可以包含三个及以上规则对象。
 */
declare class RuleChain {
    private headRule;
    constructor(headRule: Head, tailRule?: Tail);
    setTailRule(rule: Tail): void;
    /**
     *
     * @param previousTime 上个时间，毫秒表示的时间戳
     * @returns 下一个合法时间点，毫秒表示的时间戳
     */
    generateNextTime(previousTime: number): number;
}
export { Head, Tail, RuleChain, TimePointRule, Frequency, SecondFrequency, MinuteFrequency, HourFrequency, DayFrequency, HourRangeRule, DayRangeRule, };
