2018-06-21 19:42:18 +02:00
|
|
|
import { Map } from "./map";
|
|
|
|
|
|
|
|
var nextId: usize = 1;
|
|
|
|
var stringToId: Map<string, usize>;
|
|
|
|
var idToString: Map<usize, string>;
|
|
|
|
|
|
|
|
export class Symbol {
|
|
|
|
|
|
|
|
static for(key: string): Symbol {
|
|
|
|
if (!stringToId) { stringToId = new Map(); idToString = new Map(); }
|
|
|
|
else if (stringToId.has(key)) return changetype<Symbol>(stringToId.get(key));
|
|
|
|
var id = nextId++;
|
2018-06-21 22:47:37 +02:00
|
|
|
if (!id) unreachable(); // out of ids
|
2018-06-21 19:42:18 +02:00
|
|
|
stringToId.set(key, id);
|
|
|
|
idToString.set(id, key);
|
|
|
|
return changetype<Symbol>(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
static keyFor(sym: Symbol): string | null {
|
|
|
|
return idToString !== null && idToString.has(changetype<usize>(sym))
|
|
|
|
? idToString.get(changetype<usize>(sym))
|
|
|
|
: null;
|
|
|
|
}
|
|
|
|
|
|
|
|
constructor(description: string | null = null) {
|
2018-06-21 22:47:37 +02:00
|
|
|
var id = nextId++;
|
|
|
|
if (!id) unreachable(); // out of ids
|
|
|
|
return changetype<Symbol>(id);
|
2018-06-21 19:42:18 +02:00
|
|
|
}
|
|
|
|
}
|