declare function buildArrayMetadataWithArray<T>(newArrayMetadata: Iterable<T>): (arrayMetadata: T[]) => T[];

declare function buildArrayMetadataWithElement<T>(newMetadata: T): (arrayMetadata: T[]) => T[];

declare function buildArrayMetadataWithIndex<T>(newMetadata: T, index: number): (arrayMetadata: T[]) => T[];

declare function buildEmptyArrayMetadata<T>(): T[];

declare function buildEmptyMapMetadata<TKey, TValue>(): Map<TKey, TValue>;

declare function buildEmptySetMetadata<T>(): Set<T>;

declare function getOwnReflectMetadata<TMetadata>(target: object, metadataKey: unknown, propertyKey?: string | symbol): TMetadata | undefined;

declare function getReflectMetadata<TMetadata>(target: object, metadataKey: unknown, propertyKey?: string | symbol): TMetadata | undefined;

declare function setReflectMetadata(target: object, metadataKey: unknown, metadata: unknown, propertyKey?: string | symbol): void;

declare function updateOwnReflectMetadata<TMetadata>(target: object, metadataKey: unknown, buildDefaultValue: () => TMetadata, callback: (metadata: TMetadata) => TMetadata, propertyKey?: string | symbol): void;

declare function updateReflectMetadata<TMetadata>(target: object, metadataKey: unknown, buildDefaultValue: () => TMetadata, callback: (metadata: TMetadata) => TMetadata, propertyKey?: string | symbol): void;

declare function updateSetMetadataWithList<T>(metadataList: Iterable<T>): (setMetadata: Set<T>) => Set<T>;

export { buildArrayMetadataWithArray, buildArrayMetadataWithElement, buildArrayMetadataWithIndex, buildEmptyArrayMetadata, buildEmptyMapMetadata, buildEmptySetMetadata, getOwnReflectMetadata, getReflectMetadata, setReflectMetadata, updateOwnReflectMetadata, updateReflectMetadata, updateSetMetadataWithList };
