calcium-lang
Version:
Calcium language interpreter
75 lines • 2.87 kB
JavaScript
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