UNPKG

derw

Version:

An Elm-inspired language that transpiles to TypeScript

218 lines (217 loc) 6.36 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 () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.Collision = Collision; exports.collisions = collisions; const List = __importStar(require("./stdlib/List")); const Maybe_1 = require("./stdlib/Maybe"); function Collision(args) { return { ...args, }; } function Seen(args) { return { ...args, }; } function Names(args) { return { ...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))); }