UNPKG

calcium-lang

Version:
75 lines 2.87 kB
import { default as Sym } from "../symbol"; import { createInt, createList, createStr, None } from "."; import { AttributeNotFound, KeyMustBeStrOrInt } from "../error"; import createBuiltinMethod from "./builtinMethod"; export default function createDict(value) { let map = new Map(); const self = new Proxy({}, { get(target, property, receiver) { if (property === Sym.evaluate) return (env) => { const newMap = new Map(); map.forEach((v, k, _) => { newMap.set(k, v); }); map = newMap; return self; }; else if (property === Sym.value) return map; else if (property === Sym.iter) { let counter = 0; const keys = new Array(...map.keys()); return { next() { if (counter >= keys.length) return undefined; else return map.get(keys[counter++]); }, }; } else if (property === Sym.len) return createInt(map.size); else if (property === Sym.subscript) return (key, value) => { let keyValue = Reflect.get(key, Sym.value); if (typeof keyValue !== "string" && typeof keyValue !== "number") { throw new KeyMustBeStrOrInt(); } if (value === undefined) { const val = map.get(keyValue); if (val === undefined) return None; else return val; } else { map.set(keyValue, value); return None; } }; else if (property === "keys") { return createBuiltinMethod({ name: "keys", body: (args, env) => { const keys = new Array(...map.keys()).map((k) => { if (typeof k === "string") { return createStr(k); } else { return createInt(k); } }); return createList(keys); }, }); } else if (property === Sym.class) return "dict"; throw new AttributeNotFound(property.toString()); }, }); return self; } //# sourceMappingURL=dict.js.map