import type { Task } from "../Task/model"; import type * as C from "./Cause"; import type { Exit } from "./model"; export const fold_ = (exit: Exit, onFailure: (e: C.Cause) => B, onSuccess: (a: A) => B): B => { switch (exit._tag) { case "Success": { return onSuccess(exit.value); } case "Failure": { return onFailure(exit.cause); } } }; export const fold = (onFailure: (e: C.Cause) => B, onSuccess: (a: A) => B) => (exit: Exit): B => fold_(exit, onFailure, onSuccess); /** * Folds over the value or cause. */ export const foldTask_ = ( exit: Exit, onFailure: (e: C.Cause) => Task, onSuccess: (a: A) => Task ): Task => { switch (exit._tag) { case "Success": { return onSuccess(exit.value); } case "Failure": { return onFailure(exit.cause); } } }; export const foldTask = ( onFailure: (e: C.Cause) => Task, onSuccess: (a: A) => Task ) => (exit: Exit) => foldTask_(exit, onFailure, onSuccess);