import { Err, Result } from "../result"; import { Type } from "../type"; export class MapType extends Type> { readonly keyType: Type; readonly valueType: Type; constructor(k: Type, v: Type) { super(); this.keyType = k; this.valueType = v; } check(val: any): Result> { if(!(val instanceof Map)) return new Err(`${val} is not an instance of Map`); for(const [k, v] of val) { const kResult = this.keyType.check(k); if(kResult instanceof Err) return new Err(`{val} key error: ${kResult.message}`); const vResult = this.valueType.check(v); if(vResult instanceof Err) return new Err(`{val} value error: ${vResult.message}`); } return val as Map; } sliceResult(val: any): Result> { if(!(val instanceof Map)) return new Err(`${val} is not an instance of Map`); const result: Map = new Map(); for(const [k, v] of val) { const kResult = this.keyType.sliceResult(k); if(kResult instanceof Err) return new Err(`{val} key error: ${kResult.message}`); const vResult = this.valueType.sliceResult(v); if(vResult instanceof Err) return new Err(`{val} value error: ${vResult.message}`); result.set(kResult, vResult); } return result; } } export function map(k: Type, v: Type): MapType { return new MapType(k, v); }