import type { AnyComputeBuiltin } from '../../builtin.ts';
import { Void } from '../../data/wgslTypes.ts';
import { type TgpuNamable } from '../../shared/meta.ts';
import { $internal } from '../../shared/symbols.ts';
import type { InferIO, IORecord } from './fnTypes.ts';
/**
 * Describes a compute entry function signature (its arguments, return type and workgroup size)
 */
type TgpuComputeFnShellHeader<ComputeIn extends IORecord<AnyComputeBuiltin>> = {
    readonly argTypes: ComputeIn[keyof ComputeIn][];
    readonly returnType: Void;
    readonly workgroupSize: number[];
    readonly entryPoint: 'compute';
};
/**
 * Describes a compute entry function signature (its arguments, return type and workgroup size).
 * Allows creating tgpu compute functions by calling this shell
 * and passing the implementation (as WGSL string or JS function) as the argument.
 */
export type TgpuComputeFnShell<ComputeIn extends IORecord<AnyComputeBuiltin>> = TgpuComputeFnShellHeader<ComputeIn> & 
/**
 * Creates a type-safe implementation of this signature
 */
((implementation: (input: InferIO<ComputeIn>) => undefined) => TgpuComputeFn<ComputeIn>) & 
/**
 * @param implementation
 *   Raw WGSL function implementation with header and body
 *   without `fn` keyword and function name
 *   e.g. `"(x: f32) -> f32 { return x; }"`;
 */ ((implementation: string) => TgpuComputeFn<ComputeIn>) & ((strings: TemplateStringsArray, ...values: unknown[]) => TgpuComputeFn<ComputeIn>);
export interface TgpuComputeFn<ComputeIn extends IORecord<AnyComputeBuiltin> = any> extends TgpuNamable {
    readonly [$internal]: true;
    readonly shell: TgpuComputeFnShellHeader<ComputeIn>;
    $uses(dependencyMap: Record<string, unknown>): this;
}
export interface ComputeFnOptions {
    workgroupSize: number[];
}
export declare function computeFn(options: {
    workgroupSize: number[];
}): TgpuComputeFnShell<{}>;
export declare function computeFn<ComputeIn extends IORecord<AnyComputeBuiltin>>(options: {
    in: ComputeIn;
    workgroupSize: number[];
}): TgpuComputeFnShell<ComputeIn>;
export declare function isTgpuComputeFn<ComputeIn extends IORecord<AnyComputeBuiltin>>(value: unknown): value is TgpuComputeFn<ComputeIn>;
export {};
