import { FDisposable } from "./f_disposable.js";
import { FInitable } from "./f_initable.js";
import { FExecutionContext } from "../execution_context/f_execution_context.js";
export declare namespace FUsing {
    type ResourceInitializerWithExecutionContext<T> = (executionContext: FExecutionContext) => T | Promise<T>;
    type ResourceInitializerWithoutExecutionContext<T> = () => T | Promise<T>;
    type ResourceInitializer<T> = ResourceInitializerWithExecutionContext<T> | ResourceInitializerWithoutExecutionContext<T>;
    type WorkerWithExecutionContext<TResource, TResult> = (executionContext: FExecutionContext, resource: TResource) => Result<TResult>;
    type WorkerWithoutExecutionContext<TResource, TResult> = (resource: TResource) => Result<TResult>;
    type Worker<TResource, TResult> = WorkerWithExecutionContext<TResource, TResult> | WorkerWithoutExecutionContext<TResource, TResult>;
    type Result<T> = T | Promise<T>;
}
/**
 * @deprecated Use TypeScript 5.2 introduces a new keyword - 'using'. See https://github.com/tc39/proposal-explicit-resource-management
 */
export declare function FUsing<TResource extends FInitable | FDisposable, TResult>(executionContext: FExecutionContext, resourceFactory: FUsing.ResourceInitializer<TResource>, worker: FUsing.Worker<TResource, TResult>): Promise<TResult>;
