export type Atom = { NewVertex?: NewVertex; EdgeMap?: EdgeMap; }; export type NewVertex = { up_context: Position[]; down_context: Position[]; flag: Flag; }; export type Flag = { bits: number } | number; export type Meta = { basename: string; metadata: number }; export function bits(f: Flag): number { return typeof f == 'number' ? f : f.bits; } export type Position = { change: number; pos: number; }; export type Vertex = { change: number; start: number; end: number; }; export type EdgeMap = { edges: Edge[]; inode: Position; }; export type Deps = null | { hashes: string[]; deps: string[]; known?: string[] }; export type Edge = { previous: Flag; flag: Flag; from: Position; to: Vertex; introduced_by: number; }; export type Contents = | { Add: string; } | { Del: string; }; export type Hunk = { FileAdd?: { meta: Meta; context: Position[]; contents: Contents[]; }; FileMove?: { old: Meta[]; meta: Meta; up: Position[]; down: Position[]; }; FileDel?: { deleted_names: Meta[]; del: Atom; content_edges: Edge[]; content: Contents[]; }; FileUndel?: { undel_names: Meta[]; undel: Atom; content_edges: Edge[]; content: Contents[]; }; SolveNameConflict?: { old: Meta[]; name: Atom; }; UnsolveNameConflict?: { old: Meta[]; name: Atom; }; Edit?: { path: string; line: number; atom: Atom; contents: Contents[]; }; Replacement?: { inode: number; path: string; line: number; ins: NewVertex; del: EdgeMap; ins_contents: Contents[]; del_contents: Contents[]; }; SolveOrderConflict?: { path: string; line: number; atom: Atom; contents: Contents[]; }; UnsolveOrderConflict?: { path: string; line: number; atom: Atom; contents: Contents[]; }; ResurrectZombie?: { path: string; line: number; atom: Atom; contents: Contents[]; }; AddRoot?: { name: Atom; atom: Atom; }; DelRoot?: { name: Atom; atom: Atom; }; };