import { Disposable } from "./types.ts";
export async function usingResource<T extends Disposable, R = unknown>( resource: T, fn: (resource: T) => R | Promise<R>,): Promise<R> { try { return await fn(resource); } finally { await resource.dispose(); }}
export async function usingAllResources< T extends readonly Disposable[], R = unknown,>( resources: [...T], fn: (...resources: [...T]) => R | Promise<R>,): Promise<R> { try { return await fn(...resources); } finally { await Promise.all(resources.map((r) => r.dispose())); }}
export function usingResourceSync<T extends Disposable<void>, R = unknown>( resource: T, fn: (resource: T) => R,): R { try { return fn(resource); } finally { resource.dispose(); }}
export function usingAllResourcesSync< T extends Disposable<void>[], R = unknown,>( resources: [...T], fn: (...resources: [...T]) => R,): R { try { return fn(...resources); } finally { resources.forEach((r) => r.dispose()); }}
export function using<T extends Disposable, R = unknown>( resource: T, fn: (resource: T) => R | Promise<R>,): Promise<R> { return usingResource(resource, fn);}
export function usingAll< T extends readonly Disposable[], R = unknown,>( resources: [...T], fn: (...resources: [...T]) => R | Promise<R>,): Promise<R> { return usingAllResources(resources, fn);}
export function usingSync<T extends Disposable<void>, R = unknown>( resource: T, fn: (resource: T) => R,): R { return usingResourceSync(resource, fn);}
export function usingAllSync< T extends Disposable<void>[], R = unknown,>( resources: [...T], fn: (...resources: [...T]) => R,): R { return usingAllResourcesSync(resources, fn);}