import { UnknownData } from '../data/dataTypes.ts';
import { type Snippet } from '../data/snippet.ts';
import { type BaseData, type F16, type F32, type I32, type U32, type WgslStruct } from '../data/wgslTypes.ts';
import type { ResolutionCtx } from '../types.ts';
type ConversionAction = 'ref' | 'deref' | 'cast' | 'none';
export type ConversionResultAction = {
    sourceIndex: number;
    action: ConversionAction;
    targetType?: U32 | F32 | I32 | F16;
};
export type ConversionResult = {
    targetType: BaseData;
    actions: ConversionResultAction[];
    hasImplicitConversions?: boolean;
};
export declare function getBestConversion(types: BaseData[], targetTypes?: BaseData[]): ConversionResult | undefined;
/**
 * Unifies input types to a common type.
 */
export declare function unify<T extends (BaseData | UnknownData)[] | []>(inTypes: T, restrictTo?: BaseData[]): {
    [K in keyof T]: BaseData;
} | undefined;
/**
 * Unifies input types to a common type.
 * Unlike `unify`, it does not allow implicit conversions.
 */
export declare function unifyStrict<T extends (BaseData | UnknownData)[] | []>(inTypes: T, restrictTo?: BaseData[]): {
    [K in keyof T]: BaseData;
} | undefined;
export declare function convertToCommonType<T extends Snippet[]>(ctx: ResolutionCtx, values: T, restrictTo?: BaseData[], verbose?: boolean): T | undefined;
export declare function tryConvertSnippet(ctx: ResolutionCtx, snippet: Snippet, targetDataTypes: BaseData | BaseData[], verbose?: boolean): Snippet;
export declare function convertStructValues(ctx: ResolutionCtx, structType: WgslStruct, values: Record<string, Snippet>): Snippet[];
export {};
