UNPKG

@effect-ts/system

Version:

Effect-TS is a zero dependency set of libraries to write highly productive, purely functional TypeScript at scale.

37 lines (33 loc) 1.22 kB
// ets_tracing: off import * as Tp from "../../Collections/Immutable/Tuple/index.js" import * as T from "../deps.js" import type { Managed } from "../managed.js" import { makeReleaseMap, releaseAll } from "../ReleaseMap/index.js" export class Allocation<A> { constructor(readonly value: A, readonly release: T.UIO<void>) {} } /** * Allocates the managed for future usage & release. * * Note: in case of failures during acquisition resources that * have been acquired will be immediately released. In case the * managed succeeds in acquiring all the resources an Allocation * will be returned and it is up to the caller to ensure invokation * of `release`, if that is not done resources will not be released. */ export function allocate<R, E, A>(self: Managed<R, E, A>) { return T.chain_(makeReleaseMap, (rm) => T.foldCauseM_( T.provideSome_(self.effect, (r: R) => Tp.tuple(r, rm)), (cause) => T.chain_(releaseAll(T.exitHalt(cause), T.sequential)(rm), () => T.halt(cause)), ({ tuple: [_, a] }) => T.succeed( new Allocation( a, T.descriptorWith((d) => releaseAll(T.exitInterrupt(d.id), T.sequential)(rm)) ) ) ) ) }