UNPKG

derw

Version:

An Elm-inspired language that transpiles to TypeScript

272 lines (271 loc) 9.28 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.generateExportBlock = exports.generateImportBlock = exports.flattenLeftPipe = exports.generateListDestructurePart = exports.generateListRange = exports.generateFormatStringValue = exports.generateStringValue = exports.generateValue = void 0; const Utils_1 = require("../Utils"); const List = __importStar(require("../stdlib/List")); function FunctionCall(args) { return Object.assign({ kind: "FunctionCall" }, args); } function LambdaCall(args) { return Object.assign({ kind: "LambdaCall" }, args); } function generateValue(value) { return value.body; } exports.generateValue = generateValue; function generateStringValue(string) { return `"${string.body}"`; } exports.generateStringValue = generateStringValue; function generateFormatStringValue(string) { return "`" + string.body + "`"; } exports.generateFormatStringValue = generateFormatStringValue; function generateListRange(list) { const gap = `${list.end.body} - ${list.start.body} + 1`; return `Array.from({ length: ${gap} }, (_ReservedX, _ReservedI) => _ReservedI + ${list.start.body})`; } exports.generateListRange = generateListRange; function generateListDestructurePart(part) { switch (part.kind) { case "EmptyList": { return "[]"; } case "StringValue": { const { body } = part; return body; } case "FormatStringValue": { const { body } = part; return body; } case "Value": { const { body } = part; return body; } case "Destructure": { const { constructor, pattern } = part; const generatedPattern = pattern ? ` ${pattern}` : ""; return `${constructor}${pattern}`; } } } exports.generateListDestructurePart = generateListDestructurePart; function addArgsToModuleReference(moduleReference, newArgs) { switch (moduleReference.value.kind) { case "FunctionCall": { const { args, name } = moduleReference.value; return Object.assign(Object.assign({}, moduleReference), { value: FunctionCall({ name, args: List.append(args, newArgs) }) }); } case "Value": { const { body } = moduleReference.value; return Object.assign(Object.assign({}, moduleReference), { value: FunctionCall({ name: body, args: newArgs }) }); } default: { return moduleReference; } } } function flattenLeftPipe(leftPipe) { const left = leftPipe.left; const right = leftPipe.right; switch (right.kind) { case "FunctionCall": { const { name, args } = right; return FunctionCall({ name, args: List.append(args, [left]) }); } case "Value": { const { body } = right; return FunctionCall({ name: body, args: [left] }); } case "ModuleReference": { return addArgsToModuleReference(right, [left]); } case "Lambda": { return LambdaCall({ lambda: right, args: [left] }); } case "LeftPipe": { switch (right.left.kind) { case "FunctionCall": { const { args, name } = right.left; const fn = FunctionCall({ name, args: List.append(args, [left]) }); return flattenLeftPipe({ kind: "LeftPipe", left: fn, right: right.right }); } case "Value": { const { body } = right.left; const fn = FunctionCall({ name: body, args: [left] }); return flattenLeftPipe({ kind: "LeftPipe", left: fn, right: right.right }); } case "ModuleReference": { const fn = addArgsToModuleReference(right.left, [left]); return flattenLeftPipe({ kind: "LeftPipe", left: fn, right: right.right }); } case "Lambda": { const fn = LambdaCall({ lambda: right.left, args: [left] }); return flattenLeftPipe({ kind: "LeftPipe", left: fn, right: right.right }); } case "LeftPipe": { return right; } default: { return right.left; } } ; } } } exports.flattenLeftPipe = flattenLeftPipe; function generateModule(module) { if (module.namespace === "Relative") { const withoutQuotes = module.name.slice(1, -1); const name = (function () { switch (module.alias.kind) { case "Just": { const { value } = module.alias; return value; } case "Nothing": { return (0, Utils_1.getNameFromPath)(withoutQuotes); } } })(); const filteredExposing = (function () { switch (module.alias.kind) { case "Just": { const { value } = module.alias; return List.filter(function (expose) { return expose !== value; }, module.exposing); } case "Nothing": { return module.exposing; } } })(); const exposed = `import { ${filteredExposing.join(", ")} } from ${module.name};`; if (module.exposing.length === 0) { return `import * as ${name} from ${module.name};`; } else { switch (module.alias.kind) { case "Just": { return `import * as ${name} from ${module.name};\n${exposed}`; } case "Nothing": { return exposed; } } ; } ; } else { const name = (function () { switch (module.alias.kind) { case "Just": { const { value } = module.alias; return value; } case "Nothing": { return module.name; } } })(); const exposed = `import { ${module.exposing.join(", ")} } from "${module.name}";`; if (module.exposing.length === 0) { return `import * as ${name} from "${module.name}";`; } else { switch (module.alias.kind) { case "Just": { return `import * as ${name} from "${module.name}";\n${exposed}`; } case "Nothing": { return exposed; } } ; } ; } } function generateImportBlock(imports) { return (function (y) { return y.join("\n"); })(List.map(generateModule, List.filter(function (module) { return module.name !== "globalThis"; }, imports.modules))); } exports.generateImportBlock = generateImportBlock; function generateExportBlock(exports) { return (function (x) { return x.join("\n"); })(List.map(function (name) { return `export { ${name} };`; }, exports.names)); } exports.generateExportBlock = generateExportBlock;