derw
Version:
An Elm-inspired language that transpiles to TypeScript
203 lines (202 loc) • 6.05 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.collisions = exports.Collision = void 0;
const List = __importStar(require("./stdlib/List"));
const Maybe_1 = require("./stdlib/Maybe");
function Collision(args) {
return Object.assign({}, args);
}
exports.Collision = Collision;
function Seen(args) {
return Object.assign({}, args);
}
function Names(args) {
return Object.assign({}, args);
}
function moduleNames(index, module) {
const moduleName = (function () {
switch (module.alias.kind) {
case "Just": {
const { value } = module.alias;
return value;
}
case "Nothing": {
return module.name;
}
}
})();
return {
modules: [{
name: moduleName,
indexes: [index]
}],
values: List.map(function (name) {
return {
indexes: [index],
name
};
}, module.exposing)
};
}
function blockNames(block, index) {
switch (block.kind) {
case "Function": {
const { name } = block;
return {
modules: [],
values: [{
name,
indexes: [index]
}]
};
}
case "Const": {
const { name } = block;
return {
modules: [],
values: [{
name,
indexes: [index]
}]
};
}
case "UnionType": {
const { type } = block;
return {
modules: [],
values: [{
name: type.name,
indexes: [index]
}]
};
}
case "TypeAlias": {
const { type } = block;
return {
modules: [],
values: [{
name: type.name,
indexes: [index]
}]
};
}
case "Import": {
const { modules } = block;
function step(module, names) {
const modNames = moduleNames(index, module);
return {
modules: List.append(names.modules, modNames.modules),
values: List.append(names.values, modNames.values)
};
}
return List.foldr(step, {
modules: [],
values: []
}, modules);
}
default: {
return {
modules: [],
values: []
};
}
}
}
function mergeSeen(seen, seens) {
const hasBeenSeen = (function (x) {
return x.length > 0;
})(List.filter(function (x) {
return x.name === seen.name;
}, seens));
function mapper(innerSeen) {
if (innerSeen.name === seen.name) {
return {
name: innerSeen.name,
indexes: List.append(seen.indexes, innerSeen.indexes)
};
}
else {
return innerSeen;
}
}
if (hasBeenSeen) {
return List.map(mapper, seens);
}
else {
return [seen, ...seens];
}
}
function mergeNames(first, second) {
const modules = List.foldr(mergeSeen, [], List.append(first.modules, second.modules));
const values = List.foldr(mergeSeen, [], List.append(first.values, second.values));
return {
modules,
values
};
}
function flattenNames(names) {
return List.foldr(function (currentNames, finalNames) {
return mergeNames(currentNames, finalNames);
}, {
modules: [],
values: []
}, names);
}
function seenToCollision(seen) {
if (seen.indexes.length > 1) {
return (0, Maybe_1.Just)({ value: {
name: seen.name,
indexes: seen.indexes
} });
}
else {
return (0, Maybe_1.Nothing)({});
}
}
function namesToCollisions(names) {
function collisionStep(seen, collisions) {
const _res311046558 = seenToCollision(seen);
switch (_res311046558.kind) {
case "Nothing": {
return collisions;
}
case "Just": {
const { value } = _res311046558;
return [{
name: value.name,
indexes: value.indexes
}, ...collisions];
}
}
}
const moduleCollisions = List.foldr(collisionStep, [], names.modules);
const valueCollisions = List.foldr(collisionStep, [], names.values);
return List.append(moduleCollisions, valueCollisions);
}
function collisions(blocks) {
return namesToCollisions(flattenNames(List.indexedMap(blockNames, blocks)));
}
exports.collisions = collisions;