@blainehansen/macro-ts
Version:
An ergonomic typescript compiler that enables typesafe syntactic macros.
101 lines • 2.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.longestMatchingStem = exports.NonEmptyOrSingle = exports.NonEmpty = exports.cachedLookup = exports.Cache = exports.Registry = exports.setExtend = exports.exec = exports.tuple = void 0;
const c = require("@ts-std/codec");
const monads_1 = require("@ts-std/monads");
function tuple(...items) {
return items;
}
exports.tuple = tuple;
function exec(fn) {
return fn();
}
exports.exec = exec;
function setExtend(a, b) {
const union = new Set(a);
for (const item of b)
union.add(item);
return union;
}
exports.setExtend = setExtend;
class Registry {
items = {};
peek(key) {
return key in this.items;
}
take(key) {
const item = this.items[key];
delete this.items[key];
return item;
}
put(key, item) {
this.items[key] = item;
}
}
exports.Registry = Registry;
class Cache {
map = new Map();
has(key) {
return this.map.has(key);
}
get(key) {
return this.map.get(key);
}
set(key, value) {
this.map.set(key, value);
return value;
}
}
exports.Cache = Cache;
function cachedLookup(fn) {
const cache = new Map();
return (key) => {
const item = cache.get(key);
if (item !== undefined)
return item;
const actual = fn(key);
cache.set(key, actual);
return actual;
};
}
exports.cachedLookup = cachedLookup;
var NonEmpty;
(function (NonEmpty) {
function decoder(decoder) {
const arrayDecoder = c.array(decoder);
return c.wrap(`NonEmpty<${decoder.name}>`, input => {
const result = arrayDecoder.decode(input);
if (result.is_err())
return result;
const values = result.value;
if (values.length === 0)
return (0, monads_1.Err)(`array empty, expected at least one item`);
return (0, monads_1.Ok)([values[0], ...values.slice(1)]);
});
}
NonEmpty.decoder = decoder;
function flattenInto(item) {
return Array.isArray(item) ? item : [item];
}
NonEmpty.flattenInto = flattenInto;
})(NonEmpty = exports.NonEmpty || (exports.NonEmpty = {}));
var NonEmptyOrSingle;
(function (NonEmptyOrSingle) {
function decoder(decoder) {
return c.union(decoder, NonEmpty.decoder(decoder));
}
NonEmptyOrSingle.decoder = decoder;
})(NonEmptyOrSingle = exports.NonEmptyOrSingle || (exports.NonEmptyOrSingle = {}));
function longestMatchingStem(value, stems) {
const longest = { length: 0, stem: undefined };
for (const stem of stems) {
const stemLength = stem.length;
if (stemLength <= longest.length || !value.startsWith(stem))
continue;
longest.stem = stem;
longest.length = stemLength;
}
return longest.stem;
}
exports.longestMatchingStem = longestMatchingStem;
//# sourceMappingURL=utils.js.map