import type { DataChangeDescription } from '../../dataChangeDescription';
import type { MissMap, ScopeId, ScopeProvider } from '../../dataModelTypes';
export declare const NULL_KEY_STRING = "\0__AG_NULL__\0";
export declare const UNDEFINED_KEY_STRING = "\0__AG_UNDEFINED__\0";
/**
 * Converts an array of keys to a string representation.
 * Objects are JSON-stringified, other values are joined with '-'.
 * Null and undefined values use distinct sentinel strings to avoid collision with each other
 * and with the literal strings "null" and "undefined".
 * Arrays are recursively processed to preserve null/undefined distinction within elements.
 */
export declare function toKeyString(keys: any[]): string;
/**
 * Fixes a numeric extent to ensure both values are finite numbers.
 * Returns empty array if extent is null or contains non-finite values.
 */
export declare function fixNumericExtent(extent: Array<number | Date> | null): [] | [number, number];
/**
 * Gets the miss count for a given scope provider from the miss map.
 */
export declare function getMissCount(scopeProvider: ScopeProvider, missMap: MissMap | undefined): number;
/**
 * Type guard to check if an object has a scopes property.
 */
export declare function isScoped<T extends object>(obj: T): obj is T & {
    scopes: string[];
};
/**
 * Creates an array of a given length filled with a value.
 * More efficient than Array.fill for large arrays.
 */
export declare function createArray<T>(length: number, value: T): T[];
/**
 * Deduplicate change descriptions (multiple scopes can share the same DataSet/change descriptor).
 */
export declare function uniqueChangeDescriptions(scopeChanges: Map<ScopeId, DataChangeDescription>): Set<DataChangeDescription>;
/**
 * Extracts keys from arrays at a specific datum index.
 * Returns undefined if any key is null or undefined (unless allowNull is true).
 * When allowNull is true, both null and undefined are allowed as valid keys.
 */
export declare function datumKeys(keys: Array<unknown[] | undefined>, datumIndex: number, allowNull?: boolean): any[] | undefined;
/**
 * Parses a property path string into components.
 * Supports dot notation (a.b), bracket notation (a['b']), and array indices (a[0]).
 * Returns undefined if the path is invalid.
 */
export declare function getPathComponents(path: string): string[] | undefined;
/**
 * Creates an accessor function for a given property path.
 * The accessor traverses the path components to retrieve nested values.
 */
export declare function createPathAccessor(components: string[]): (datum: any) => any;
