import * as IO from "../../helpers/io.js";
import { AnyRecord, CleanRecordType, Record } from "../records/record.js";
import { RecordKey } from "../records/recordKey.js";
import { RAnyRecordType, RRecordType, RecordType } from "../records/recordType.js";
export interface RecordLink<T extends AnyRecord> {
    entity: string;
    originalEntity?: string;
    versionCreatedAt?: Date;
    recordId: string;
    _type?: T;
}
export type AnyRecordLink = RecordLink<AnyRecord>;
export declare class RRecordLinkClass<T extends RAnyRecordType> extends IO.Type<RecordLink<Record<IO.TypeOf<T>, any>>, unknown, unknown> {
    constructor(_type?: T);
}
declare function recordLink<T extends AnyRecord>(type?: CleanRecordType<T>): RRecordLinkClass<IO.Type<T["type"], any, unknown>>;
declare function recordLinkOf<E extends string, R extends string>(_entity: E, _recordId: R): RRecordLinkClass<RRecordType<any, any, E, R>>;
export type RecordLinkOf<E extends string, R extends string> = RecordLink<Record<RecordType<any, any, E, R>, any>>;
declare function buildRecordLink(entity: string, recordId: string): AnyRecordLink;
declare function linkToKey<T extends AnyRecord>(link: RecordLink<T>): RecordKey<T>;
declare function isLinkedRecord<R extends AnyRecord, L extends R>(record: R, recordLink: RecordLink<L>): record is L;
declare function findLinkedRecord<R extends AnyRecord, L extends R>(records: ReadonlyArray<R>, link: RecordLink<L>): L | undefined;
declare function isSameRecordLink(link1: AnyRecordLink, link2: AnyRecordLink): boolean;
export declare const RecordLink: {
    io: typeof recordLink;
    ioOf: typeof recordLinkOf;
    new: typeof buildRecordLink;
    toKey: typeof linkToKey;
    isRecord: typeof isLinkedRecord;
    findRecord: typeof findLinkedRecord;
    isSame: typeof isSameRecordLink;
};
export declare const AnyRecordLink: {
    io: () => RRecordLinkClass<IO.Type<import("../records/recordType.js").AnyRecordType, any, unknown>>;
};
export {};
