import type { MatBase } from '../data/matrix.ts';
import { type Snippet } from '../data/snippet.ts';
import type { VecBase } from '../data/vectorImpl.ts';
import type { AnyMatInstance, AnyNumericVecInstance } from '../data/wgslTypes.ts';
export declare const infixOperators: {
    readonly add: import("../types.ts").DualFn<{
        (lhs: number, rhs: number): number;
        <T extends AnyNumericVecInstance>(lhs: number, rhs: T): T;
        <T extends AnyNumericVecInstance>(lhs: T, rhs: number): T;
        <T extends AnyNumericVecInstance | AnyMatInstance>(lhs: T, rhs: T): T;
        <Lhs extends number | AnyNumericVecInstance | AnyMatInstance, Rhs extends Lhs extends number ? number | AnyNumericVecInstance : Lhs extends AnyNumericVecInstance ? number | Lhs : Lhs extends AnyMatInstance ? Lhs : never>(lhs: Lhs, rhs: Rhs): Lhs | Rhs;
    }>;
    readonly sub: import("../types.ts").DualFn<{
        (lhs: number, rhs: number): number;
        <T extends AnyNumericVecInstance>(lhs: number, rhs: T): T;
        <T extends AnyNumericVecInstance>(lhs: T, rhs: number): T;
        <T extends AnyNumericVecInstance | AnyMatInstance>(lhs: T, rhs: T): T;
        <Lhs extends number | AnyNumericVecInstance | AnyMatInstance, Rhs extends Lhs extends number ? number | AnyNumericVecInstance : Lhs extends AnyNumericVecInstance ? number | Lhs : Lhs extends AnyMatInstance ? Lhs : never>(lhs: Lhs, rhs: Rhs): Lhs | Rhs;
    }>;
    readonly mul: import("../types.ts").DualFn<{
        (lhs: number, rhs: number): number;
        <MV extends AnyNumericVecInstance | AnyMatInstance>(lhs: number, rhs: MV): MV;
        <MV extends AnyNumericVecInstance | AnyMatInstance>(lhs: MV, rhs: number): MV;
        <V extends AnyNumericVecInstance>(lhs: V, rhs: V): V;
        <M extends AnyMatInstance, V extends import("../data/wgslTypes.ts").vBaseForMat<M>>(lhs: V, rhs: M): V;
        <M extends AnyMatInstance, V extends import("../data/wgslTypes.ts").vBaseForMat<M>>(lhs: M, rhs: V): V;
        <M extends AnyMatInstance>(lhs: M, rhs: M): M;
        <Lhs extends number | AnyNumericVecInstance | AnyMatInstance, Rhs extends Lhs extends number ? number | AnyNumericVecInstance | AnyMatInstance : Lhs extends AnyNumericVecInstance ? number | Lhs | import("../data/wgslTypes.ts").mBaseForVec<Lhs> : Lhs extends AnyMatInstance ? number | import("../data/wgslTypes.ts").vBaseForMat<Lhs> | Lhs : never>(lhs: Lhs, rhs: Rhs): Lhs | Rhs;
    }>;
    readonly div: import("../types.ts").DualFn<{
        (lhs: number, rhs: number): number;
        <T extends AnyNumericVecInstance>(lhs: T, rhs: T): T;
        <T extends AnyNumericVecInstance>(lhs: number, rhs: T): T;
        <T extends AnyNumericVecInstance>(lhs: T, rhs: number): T;
    }>;
    readonly mod: import("../types.ts").DualFn<{
        (a: number, b: number): number;
        <T extends AnyNumericVecInstance>(a: T, b: T): T;
        <T extends AnyNumericVecInstance>(a: number, b: T): T;
        <T extends AnyNumericVecInstance>(a: T, b: number): T;
    }>;
    readonly bitShiftLeft: import("../types.ts").DualFn<(<T extends import("../data/wgslTypes.ts").AnyIntegerVecInstance>(lhs: T, rhs: number | import("../data/wgslTypes.ts").vecIToVecU<T>) => T)>;
    readonly bitShiftRight: import("../types.ts").DualFn<(<T extends import("../data/wgslTypes.ts").AnyIntegerVecInstance>(lhs: T, rhs: number | import("../data/wgslTypes.ts").vecIToVecU<T>) => T)>;
};
type Numeric = number | AnyNumericVecInstance | AnyMatInstance;
export type InfixOperatorName = keyof typeof infixOperators;
export type InfixOperator = (typeof infixOperators)[InfixOperatorName];
/**
 * InfixDispatch is only used in codegen mode.
 * `lhs` may either be Numeric or Snippet.
 * @example
 * const external = d.vec2u(1);
 * const fn = () => {
 *    'use gpu';
 *    external.mul(2); // lhs is Numeric
 *    d.vec2u(1).mul(2) // lhs is a snippet
 * }
 */
export declare class InfixDispatch {
    readonly lhs: Snippet | Numeric;
    readonly operator: InfixOperator;
    constructor(lhs: Snippet | Numeric, operator: InfixOperator);
}
export declare function isInfixDispatch(o: unknown): o is InfixDispatch;
/**
 * This function is used on vec/mat prototypes.
 * This is done in runtime in order to avoid a circular dependency.
 */
export declare function assignInfixOperator<T extends typeof VecBase | typeof MatBase>(base: T, operator: InfixOperatorName, operatorSymbol: symbol): void;
export {};
