UNPKG

derw

Version:

An Elm-inspired language that transpiles to TypeScript

203 lines (202 loc) 6.05 kB
"use strict"; 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;