// @flow
declare type FilePath = string;
declare type GlobPattern = string;

export type BackendType =
  | 'fs-events'
  | 'watchman'
  | 'inotify'
  | 'windows'
  | 'brute-force';
export type EventType = 'create' | 'update' | 'delete';
export interface Options {
  ignore?: Array<FilePath | GlobPattern | RegExp>;
  backend?: BackendType;
}
export type SubscribeCallback = (err: ?Error, events: Array<Event>) => mixed;
export interface AsyncSubscription {
  unsubscribe(): Promise<void>;
}
export interface Event {
  path: FilePath;
  type: EventType;
}
declare module.exports: {
  getEventsSince(
    dir: FilePath,
    snapshot: FilePath,
    opts?: Options,
  ): Promise<Array<Event>>,
  subscribe(
    dir: FilePath,
    fn: SubscribeCallback,
    opts?: Options,
  ): Promise<AsyncSubscription>,
  unsubscribe(
    dir: FilePath,
    fn: SubscribeCallback,
    opts?: Options,
  ): Promise<void>,
  writeSnapshot(
    dir: FilePath,
    snapshot: FilePath,
    opts?: Options,
  ): Promise<FilePath>,
};
