import type { AnyWgslData, BaseData } from '../../data/wgslTypes.ts';
import { type StorageFlag } from '../../extension.ts';
import { type TgpuNamable } from '../../shared/meta.ts';
import type { Infer, InferGPU, InferInput, InferPatch, InferPartial } from '../../shared/repr.ts';
import type { TgpuSoul } from '../../shared/soul.ts';
import { $getNameForward, $gpuValueOf, $internal, $repr, $soul } from '../../shared/symbols.ts';
import { type BufferWriteOptions, type TgpuBuffer, type UniformFlag } from './buffer.ts';
export interface TgpuBufferBindingSoul<TBuffer extends TgpuBuffer<BaseData> = TgpuBuffer<BaseData>> extends TgpuSoul<'uniform' | 'mutable' | 'readonly'> {
    readonly buffer: TBuffer;
}
interface TgpuBufferBindingBase<TData extends BaseData> extends TgpuNamable {
    readonly [$internal]: true;
    readonly [$soul]: TgpuBufferBindingSoul<TgpuBuffer<TData>>;
    write(data: InferInput<TData>, options?: BufferWriteOptions): void;
    /** @deprecated Use {@link patch} instead. */
    writePartial(data: InferPartial<TData>): void;
    patch(data: InferPatch<TData>): void;
    read(): Promise<Infer<TData>>;
    readonly [$gpuValueOf]: InferGPU<TData>;
    /** Type-token, not available at runtime */
    readonly [$repr]: Infer<TData>;
}
export interface TgpuMutable<out TData extends BaseData> extends TgpuBufferBindingBase<TData> {
    readonly resourceType: 'mutable';
    readonly buffer: TgpuBuffer<TData> & StorageFlag;
    $: InferGPU<TData>;
    /** Type-token, not available at runtime */
    readonly [$repr]: Infer<TData>;
}
export interface TgpuReadonly<out TData extends BaseData> extends TgpuBufferBindingBase<TData> {
    readonly resourceType: 'readonly';
    readonly buffer: TgpuBuffer<TData> & StorageFlag;
    readonly $: InferGPU<TData>;
    /** Type-token, not available at runtime */
    readonly [$repr]: Infer<TData>;
}
export interface TgpuUniform<out TData extends BaseData> extends TgpuBufferBindingBase<TData> {
    readonly resourceType: 'uniform';
    readonly buffer: TgpuBuffer<TData> & UniformFlag;
    readonly $: InferGPU<TData>;
}
export type TgpuBufferBinding<TData extends BaseData> = TgpuMutable<TData> | TgpuReadonly<TData> | TgpuUniform<TData>;
export declare function isBufferBinding<TData extends BaseData>(value: unknown): value is TgpuBufferBinding<TData>;
export declare function isUniformBinding<TData extends BaseData>(value: unknown): value is TgpuUniform<TData>;
export declare function isMutableBinding<TData extends BaseData>(value: unknown): value is TgpuMutable<TData>;
export declare function isReadonlyBinding<TData extends BaseData>(value: unknown): value is TgpuReadonly<TData>;
/** @deprecated Use 'isBufferBinding' instead. */
export declare const isBufferShorthand: typeof isBufferBinding;
type BoundBuffer<TType, TData extends BaseData> = TgpuBuffer<TData> & (TType extends 'mutable' | 'readonly' ? StorageFlag : UniformFlag);
export declare class TgpuBufferBindingImpl<TType extends 'mutable' | 'readonly' | 'uniform', TData extends BaseData> {
    /** Type-token, not available at runtime */
    readonly [$repr]: Infer<TData>;
    readonly [$soul]: TgpuBufferBindingSoul<BoundBuffer<TType, TData>>;
    readonly [$getNameForward]: object;
    readonly resourceType: TType;
    [$internal]: true;
    $: InferGPU<TData>;
    readonly [$gpuValueOf]: InferGPU<TData>;
    constructor(usage: TType, buffer: BoundBuffer<TType, TData>);
    get buffer(): BoundBuffer<TType, TData>;
    $name(label: string): this;
    write(data: InferInput<TData>, options?: BufferWriteOptions): void;
    /** @deprecated Use {@link patch} instead. */
    writePartial(data: InferPartial<TData>): void;
    patch(data: InferPatch<TData>): void;
    read(): Promise<Infer<TData>>;
}
export declare function mutable<TData extends AnyWgslData>(buffer: TgpuBuffer<TData> & StorageFlag): TgpuMutable<TData>;
export declare function readonly<TData extends AnyWgslData>(buffer: TgpuBuffer<TData> & StorageFlag): TgpuReadonly<TData>;
export declare function uniform<TData extends AnyWgslData>(buffer: TgpuBuffer<TData> & UniformFlag): TgpuUniform<TData>;
export {};
