UNPKG

c-structs

Version:
52 lines (50 loc) 1.89 kB
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 };