type InferField<F> = F extends PrimitiveDescriptor ? number : F extends PrimitiveDescriptor[] ? number[] : F extends StructDescriptor<infer U> ? U : never;
/** Given a whole schema object, produce a “shaped” type */
type InferSchema<S extends Record<string, any>> = {
    [K in keyof S]: InferField<S[K]>;
};
/**
 * Primitive descriptor defines size, TypedArray constructor, and DataView accessors.
 */
interface PrimitiveDescriptor {
    size: number;
    arrayType: Float32ArrayConstructor | Int16ArrayConstructor | Int32ArrayConstructor | BigInt64ArrayConstructor | Uint16ArrayConstructor | Uint32ArrayConstructor | BigUint64ArrayConstructor | Float64ArrayConstructor;
    getter: keyof DataView;
    setter: keyof DataView;
}
/**
 * Descriptor for a generated struct: knows its byte-size and has a create method.
 */
interface StructDescriptor<T> {
    size: number;
    create(buffer?: ArrayBuffer, baseOffset?: number): T & {
        buffer: ArrayBuffer;
    };
}
/**
 * Primitive descriptors map
 */
declare const p: Record<string, PrimitiveDescriptor>;
/**
 * Constructor helpers for vectors, arrays, and structs.
 */
declare const c: {
    float(): PrimitiveDescriptor;
    float2(): PrimitiveDescriptor[];
    float3(): PrimitiveDescriptor[];
    float4(): PrimitiveDescriptor[];
    uint(): PrimitiveDescriptor;
    uint2(): PrimitiveDescriptor[];
    uint3(): PrimitiveDescriptor[];
    uint4(): PrimitiveDescriptor[];
    matrix4(): PrimitiveDescriptor[];
    /**
     * Create an array descriptor for nested structs.
     */
    array<T>(structDesc: StructDescriptor<T>, length: number): StructDescriptor<T[]>;
    /**
     * Create a struct descriptor from a schema map.
     */
    struct<S extends Record<string, PrimitiveDescriptor | PrimitiveDescriptor[] | StructDescriptor<any>>>(schema: S): StructDescriptor<InferSchema<S>>;
};

export { type StructDescriptor, c, p };
