import { TimeStamp } from './time-stamp';
import { DataBase } from '../db';
import { FileSystem } from './file-system';
/**
 * 表示文件不存在，时间戳设为最旧。让它和它的依赖处于 stale 状态。
 */
export declare const MTIME_NOT_EXIST: TimeStamp;
export declare const MTIME_EMPTY_DEPENDENCY: TimeStamp;
/**
 * 文件 mtime 的抽象
 *
 * 由于文件系统时间和 Node.js 的 Date API 不一致，
 * 会影响判断一个 target 是否 stale。
 * GNU Make 的 recipe 是独立进程而 makit 中是本地过程调用因此问题严重。
 * 一些实现细节：
 *
 * * mtime 使用正整数实现，特殊值取负数和 Infinity。
 * * 按 makit 第一次获知文件的顺序初始化 mtime。
 * * 同时提供 mtime 和严格递增的 now()，确保 now 和 mtime 一致。
 */
export declare class MTime {
    private readonly db;
    private readonly fs;
    private static instance;
    constructor(db: DataBase, fs: FileSystem);
    /**
     * 获取严格递增的当前时间戳
     *
     * @return 严格递增的当前时间戳
     */
    now(): TimeStamp;
    /**
     * 设置文件修改时间，不传则设置为现在
     *
     * @param fullpath  文件全路径
     * @param time  时间戳
     */
    setModifiedTime(fullpath: string, time?: TimeStamp): TimeStamp;
    /**
     * 获取文件修改时间
     *
     * @param fullpath 文件全路径
     * @return 时间戳的 Promise
     */
    getModifiedTime(fullpath: string): TimeStamp;
    private getModifiedTimeFromFileSystem;
    /**
     * 简单的校验，就可以不依赖数据库的并发一致性。
     */
    private queryAndValidate;
}
