// Some example callback-y API. Could use promises, but doesn't in this example for mild simplicity
const sampleCallbackApi = <A>(input: number, callback: (evenNumber: number) => A): A => {
if (input % 2 !== 0) {
throw new Error(`${input} is not even`)
}
return callback(input)
}
const effectApi02 = <A, E>(
input: number,
handleEvenNumber: (evenNumber: number) => Effect.Effect<A, E, never>
): Effect.Effect<A, E | Error, never> =>
Effect.gen(function*() {
const exit = yield* Effect.promise(() =>
sampleCallbackApi(input, async (evenNumber) => Effect.runPromiseExit(handleEvenNumber(evenNumber)))
)
return yield* exitToEffect(exit)
})
function exitToEffect<A, E>(
exit: Exit.Exit<A, E>
): Effect.Effect<A, E, never> {
return Effect.gen(function*() {
return yield* exit.pipe(
Exit.match({
onSuccess: (value) => Effect.succeed(value),
onFailure: (cause) => {
// Surface our "expected" errors
if (Cause.isFailType(cause)) {
return Effect.fail(cause.error)
}
return Effect.die(cause)
}
})
)
})
}
// Some example callback-y API. Could use promises, but doesn't in this example for mild simplicity
const sampleCallbackApi = <A>(input: number, callback: (evenNumber: number) => A): A => {
if (input % 2 !== 0) {
throw new Error(`${input} is not even`)
}
return callback(input)
}
const effectApi02 = <A, E>(
input: number,
handleEvenNumber: (evenNumber: number) => Effect.Effect<A, E, never>
): Effect.Effect<A, E | Error, never> =>
Effect.gen(function*() {
const exit = yield* Effect.promise(() =>
sampleCallbackApi(input, async (evenNumber) => Effect.runPromiseExit(handleEvenNumber(evenNumber)))
)
return yield* exitToEffect(exit)
})
function exitToEffect<A, E>(
exit: Exit.Exit<A, E>
): Effect.Effect<A, E, never> {
return Effect.gen(function*() {
return yield* exit.pipe(
Exit.match({
onSuccess: (value) => Effect.succeed(value),
onFailure: (cause) => {
// Surface our "expected" errors
if (Cause.isFailType(cause)) {
return Effect.fail(cause.error)
}
return Effect.die(cause)
}
})
)
})
}