@typed/io
Version:
Runtime IO type system
49 lines • 1.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.catchDecodeFailure = exports.decodeFailure = exports.Decoder = exports.decode = exports.DecodeError = exports.DecodeFailure = void 0;
const effects_1 = require("@typed/effects");
const either_1 = require("@typed/either");
const lambda_1 = require("@typed/lambda");
const logic_1 = require("@typed/logic");
const maybe_1 = require("@typed/maybe");
const strings_1 = require("@typed/strings");
exports.DecodeFailure = Symbol.for('DecodeFailure');
var DecodeError;
(function (DecodeError) {
DecodeError.create = (expected, actual, options = {}) => {
var _a;
return ({
expected,
actual,
key: logic_1.isNotUndefined(options.key) ? maybe_1.Just.of(options.key) : maybe_1.Nothing,
errors: (_a = options.errors) !== null && _a !== void 0 ? _a : [],
});
};
})(DecodeError = exports.DecodeError || (exports.DecodeError = {}));
exports.decode = lambda_1.curry(__decode);
function* __decode(decoder, input) {
return yield* decoder.decode(input);
}
var Decoder;
(function (Decoder) {
Decoder.fromGuard = (guard, expected) => ({
expected,
*decode(i) {
if (guard.is(i)) {
return i;
}
return yield* effects_1.fail(exports.DecodeFailure, DecodeError.create(expected, strings_1.toString(i)));
},
});
})(Decoder = exports.Decoder || (exports.Decoder = {}));
exports.decodeFailure = (e) => effects_1.fail(exports.DecodeFailure, e);
function* catchDecodeFailure(effect, onError) {
function* myEffect() {
const x = yield* effect;
return either_1.Either.of(x);
}
const either = yield* effects_1.catchFailure(myEffect(), exports.DecodeFailure, either_1.Left.of);
return either_1.mapLeft((e) => (onError ? [e, onError(e)] : e), either);
}
exports.catchDecodeFailure = catchDecodeFailure;
//# sourceMappingURL=Decoder.js.map