pragmatic-fp-ts
Version:
Opinionated functional programming library with easy use in mind
59 lines (58 loc) • 2.62 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.errorLoggedFuture = exports.errorLogged = void 0;
function ErrorLog(expr, errors = []) {
return {
_: (f) => ErrorLog(f(expr), errors),
try: (f, alt) => {
try {
return ErrorLog(f(expr), errors);
}
catch (err) {
return ErrorLog(alt, [...errors, err]);
}
},
effect: (f) => {
try {
f(expr);
return ErrorLog(expr, errors);
}
catch (err) {
return ErrorLog(expr, [...errors, err]);
}
},
getErrors: () => errors,
getValue: () => expr,
getValueOr: (alt) => (expr || alt),
hasErrors: () => errors.length > 0,
};
}
const FutureErrorLog = (expr, errors = Promise.resolve([])) => {
const exprP = expr instanceof Promise ? expr : Promise.resolve(expr);
const tryOrAppendError = (p, es) => p.then(() => es).catch((err) => __awaiter(void 0, void 0, void 0, function* () { return [...(yield errors), err]; }));
return {
_: (f) => FutureErrorLog(exprP.then(f), errors),
effect: (fx) => FutureErrorLog(exprP, tryOrAppendError(exprP.then(fx), errors)),
try: (f, alt) => {
const p = exprP.then(f);
return FutureErrorLog(p.catch(() => alt), tryOrAppendError(p, errors));
},
getErrors: () => errors,
getValue: () => exprP,
getValueOr: (alt) => __awaiter(void 0, void 0, void 0, function* () { return (yield exprP) || (alt instanceof Promise ? yield alt : alt); }),
hasErrors: () => errors.then((e) => e.length > 0),
};
};
const errorLogged = (value) => ErrorLog(value);
exports.errorLogged = errorLogged;
const errorLoggedFuture = (value) => FutureErrorLog(value);
exports.errorLoggedFuture = errorLoggedFuture;