UNPKG

calcium-lang

Version:
57 lines 2.14 kB
import { default as Sym } from "../symbol"; import { evaluate } from "../util"; import { createInt } from "."; import { AttributeNotFound, TupleIsImmutable } from "../error"; import Slice from "../runtime/slice"; export default function createTuple(...values) { let tuple = values; const self = new Proxy({}, { get(target, property, receiver) { if (property === Sym.evaluate) return (env) => { tuple = tuple.map((v) => evaluate(v, env)); return self; }; else if (property === Sym.value) return tuple; else if (property === Sym.class) return "tuple"; else if (property === Sym.description) { return `(${tuple .map((v) => { if (Reflect.get(v, Sym.class) === "str") { return `'${Reflect.get(v, Sym.description)}'`; } else { return Reflect.get(v, Sym.description); } }) .join(", ")})`; } else if (property === Sym.iter) { } else if (property === Sym.len) return createInt(tuple.length); else if (property === Sym.slice) return (lower, upper) => { const slice = new Slice(tuple); return createTuple(...slice.get(lower, upper)); }; else if (property === Sym.subscript) return (index, value) => { let idx = Reflect.get(index, Sym.value); if (idx < 0) idx += tuple.length; if (value !== undefined) { throw new TupleIsImmutable(); } else { return tuple[idx]; } }; throw new AttributeNotFound(property.toString()); }, }); return self; } //# sourceMappingURL=tuple.js.map