diff --git a/examples/05-concurrency.ts b/examples/05-concurrency.ts index 40c132c..1ae2df6 100644 --- a/examples/05-concurrency.ts +++ b/examples/05-concurrency.ts @@ -89,7 +89,7 @@ const rt: WaveR = }) ); -const versus = managed.provideTo(agent, rt) +const versus = managed.provideTo(agent as managed.Managed, rt) /** @@ -104,6 +104,6 @@ const firstVersusIO = ["referential+transparency", "monad", "functor", "haskell" const printResults = waver.chain(firstVersusIO, (results) => waver.encaseWaveR(consoleIO.log(`winning query was ${results[0][0].q}`))); const log = - managed.provideTo(agent, printResults); + managed.provideTo(agent as managed.Managed, printResults); wave.run(wave.applySecond(versus, log)); diff --git a/src/managed.ts b/src/managed.ts index 8242ba7..b752a42 100644 --- a/src/managed.ts +++ b/src/managed.ts @@ -19,14 +19,15 @@ import { Monoid } from "fp-ts/lib/Monoid"; import { Wave, Fiber } from "./wave"; import * as io from "./wave"; import { WaveR } from "./waver"; -import { ExitTag } from "./exit"; +import { ExitTag, Exit, done } from "./exit"; export enum ManagedTag { Pure, Encase, Bracket, Suspended, - Chain + Chain, + BracketExit } /** @@ -39,7 +40,8 @@ export type Managed = Encase | Bracket | Suspended | - Chain; // eslint-disable-line @typescript-eslint/no-explicit-any + Chain | // eslint-disable-line @typescript-eslint/no-explicit-any + BracketExit ; export interface Pure { @@ -93,6 +95,12 @@ export function bracket(acquire: Wave, release: FunctionN<[A], Wave< }; } +export interface BracketExit { + readonly _tag: ManagedTag.BracketExit; + readonly acquire: Wave; + readonly release: FunctionN<[A, Exit], Wave>; +} + export interface Suspended { readonly _tag: ManagedTag.Suspended; readonly suspended: Wave>; @@ -269,12 +277,12 @@ export function use(res: Managed, f: FunctionN<[A], Wave>): return io.chain(res.acquire, f); case ManagedTag.Bracket: return io.bracket(res.acquire, res.release, f); + case ManagedTag.BracketExit: + return io.bracketExit(res.acquire, (a, e) => res.release(a, e), f); case ManagedTag.Suspended: return io.chain(res.suspended, consume(f)); case ManagedTag.Chain: return use(res.left, (a) => use(res.bind(a), f)); - default: - throw new Error(`Die: Unrecognized current type ${res}`); } } @@ -299,6 +307,9 @@ export function allocate(res: Managed): Wave> { return io.map(res.acquire, (a) => ({ a, release: io.unit })); case ManagedTag.Bracket: return io.map(res.acquire, (a) => ({ a, release: res.release(a) })); + case ManagedTag.BracketExit: + // best effort, because we cannot know what the exit status here + return io.map(res.acquire, (a) => ({ a, release: res.release(a, done(undefined)) })); case ManagedTag.Suspended: return io.chain(res.suspended, (wm) => allocate(wm)); case ManagedTag.Chain: @@ -334,7 +345,7 @@ declare module "fp-ts/lib/HKT" { } export const instances: Monad2 = { URI, - of: (a: A): Managed => pure(a), + of: (a: A): Managed => pure(a) as Managed, map, ap: ap_, chain @@ -353,6 +364,6 @@ export function getSemigroup(Semigroup: Semigroup): Semigroup(Monoid: Monoid): Monoid> { return { ...getSemigroup(Monoid), - empty: pure(Monoid.empty) + empty: pure(Monoid.empty) as Managed } } diff --git a/src/managedr.ts b/src/managedr.ts index 3b7c011..66b91fd 100644 --- a/src/managedr.ts +++ b/src/managedr.ts @@ -157,7 +157,7 @@ declare module "fp-ts/lib/HKT" { } export const instances: Monad3 = { URI, - of: (a: A): ManagedR => pure(a), + of: (a: A): ManagedR => pure(a) as unknown as ManagedR, map, ap: ap_, chain @@ -176,6 +176,6 @@ export function getSemigroup(Semigroup: Semigroup): Semigroup(Monoid: Monoid): Monoid> { return { ...getSemigroup(Monoid), - empty: pure(Monoid.empty) + empty: pure(Monoid.empty) as unknown as ManagedR } }