@typed/io
Version:
Runtime IO type system
28 lines • 1.38 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.array = exports.Array = void 0;
const effects_1 = require("@typed/effects");
const either_1 = require("@typed/either");
const maybe_1 = require("@typed/maybe");
const strings_1 = require("@typed/strings");
const G = require("../guard");
const Decoder_1 = require("./Decoder");
const refinement_1 = require("./refinement");
exports.Array = Decoder_1.Decoder.fromGuard(G.Array, 'ReadonlyArray<unknown>');
exports.array = (decoder) => refinement_1.refinement(exports.Array, function* (input) {
if (input.length === 0) {
return input;
}
const decoded = yield* effects_1.combine(...input.map((i, index) => Decoder_1.catchDecodeFailure(decoder.decode(i), () => index)));
if (decoded.every(either_1.isRight)) {
return decoded.map((d) => either_1.fromRight(d));
}
const errors = decoded.filter(either_1.isLeft).map(either_1.fromLeft);
return yield* Decoder_1.decodeFailure(formatArrayErrors(errors, strings_1.toString(input), decoder.expected));
}, `ReadonlyArray<${decoder.expected}>`);
function formatArrayErrors(errors, value, expected) {
return Decoder_1.DecodeError.create(`ReadonlyArray<${expected}>`, value, {
errors: errors.map(([e, key]) => ({ ...e, key: maybe_1.Just.of(key.toString()) })),
});
}
//# sourceMappingURL=Array.js.map