import { FutureResult, Result } from './Result'; export type FallibleSync = ( ...args: A ) => Result; export type FallibleAsync = ( ...args: A ) => FutureResult; export type Fallible = | FallibleSync | FallibleAsync; export function FallibleSync( callback: (...args: A) => O ): FallibleSync { const fallible = function Fallible(...args: A): Result { return Result.try(() => callback(...args)); }; Object.setPrototypeOf(fallible, FallibleSync); return fallible; } export function FallibleAsync( callback: (...args: A) => O | PromiseLike ): FallibleAsync { const fallible = function Fallible(...args: A): FutureResult { return new FutureResult(() => callback(...args)); }; Object.setPrototypeOf(fallible, FallibleAsync); return fallible; } export const Fallible = FallibleAsync; export default Fallible; Object.defineProperties(Fallible, { default: { get: () => Fallible }, Fallible: { get: () => Fallible }, FallibleSync: { get: () => FallibleSync }, FallibleAsync: { get: () => FallibleAsync }, });