@typed/io
Version:
Runtime IO type system
24 lines • 1.19 kB
JavaScript
import { sequence } from '@typed/effects';
import { fromRight, isLeft } from '@typed/either';
import { toString } from '@typed/strings';
import * as G from '../guard';
import { catchDecodeFailure, DecodeError, decodeFailure, Decoder, } from './Decoder';
import { refinement } from './refinement';
const UnknownMap = Decoder.fromGuard(G.Map, `ReadonlyMap<unknown, unknown>`);
export { UnknownMap as Map };
export const map = (key, value) => {
return refinement(UnknownMap, function* (map) {
const entries = yield* sequence(function* (keyValuePair) {
const k = yield* catchDecodeFailure(key.decode(keyValuePair[0]));
const v = yield* catchDecodeFailure(value.decode(keyValuePair[1]));
if (isLeft(k) || isLeft(v)) {
const expected = `ReadonlyMap<${key.expected}, ${value.expected}>`;
const actual = toString(map);
return yield* decodeFailure(DecodeError.create(expected, actual));
}
return [fromRight(k), fromRight(v)];
}, Array.from(map));
return new Map(entries);
}, `ReadonlyMap<${key.expected}, ${value.expected}>`);
};
//# sourceMappingURL=Map.js.map