Published
Edited
Jan 10, 2022
Importers
3 stars
Insert cell
Insert cell
Insert cell
EXAMPLETYPES = EnumFactory(
['FOO', 0x01],
['BAR', 0x02],
['BAZ', 0x03]
)
Insert cell
// this member exits
EXAMPLETYPES.FOO
Insert cell
// this memeber does not exist and will throw
EXAMPLETYPES.ZAB
Insert cell
Insert cell
EXAMPLETYPES.reverseLookup(0x03)
Insert cell
Type JavaScript, then Shift-Enter. Ctrl-space for more options. Arrow ↑/↓ to switch modes.

Insert cell
Insert cell
Insert cell
Insert cell
EnumFactory = (...members) => {
const memberList = createEnumMemberList(...members);

return createEnumProxy(memberList);
}
Insert cell
createEnumMemberList = (...members) => {
const memberList = Object.create(null);

memberList.lookup = (name) => {
if (!memberList[name]) {
throw new ReferenceError(`Enum member '${name}' does not exist`);
}
return memberList[name];
};

memberList.reverseLookup = (needle) => {
const entry = Object.entries(memberList).find(
([prop, val]) => val === needle
);
return !!entry ? entry[0] : null;
};

const parseEntry = (entry) => {
if (Array.isArray(entry)) {
return [entry[0], entry[1]];
}
if (typeof entry === "string") {
return [entry, Symbol(entry)];
}
throw new SyntaxError(
`Entry must either be a string or a [<string>,<any>] tuple: ${entry} :: ${typeof entry}`
);
};
members.forEach((member) => {
const [name, value] = parseEntry(member);

if (name.toUpperCase() !== name) {
throw new SyntaxError(
`Member ${name} must be provided as uppercase (${name.toUpperCase()})`
);
}
if (Object.keys(memberList).indexOf(name) !== -1) {
throw new ReferenceError(`Enum already contains member ${name}`);
}

memberList[name] = value;
});
return memberList;
}
Insert cell
_
Insert cell
createEnumProxy = (memberList) =>
new Proxy(memberList, {
get: (target, prop, receiver) => {
try {
return target.lookup(prop);
} catch (e) {
if (typeof prop === "string" && prop === prop.toUpperCase()) {
throw e;
}
return Reflect.get(target, prop, receiver);
}
},
set: () => {
throw new SyntaxError(`Adding new members to an enum is not allowed.`);
}
})
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more