UNPKG

pogo

Version:

A readable, DSL friendly programming language that compiles to JavaScript

94 lines 3.84 kB
(function() { var self = this; var $class, _; $class = require("./class").class; _ = require("underscore"); module.exports = function(terms) { var self = this; var macroDirectory, createMacroDirectory; macroDirectory = $class({ constructor: function() { var self = this; return self.nameTreeRoot = {}; }, nameNode: function(name) { var self = this; var nameTree; nameTree = self.nameTreeRoot; _(name).each(function(nameSegment) { if (!nameTree.hasOwnProperty(nameSegment)) { return nameTree = nameTree[nameSegment] = {}; } else { return nameTree = nameTree[nameSegment]; } }); return nameTree; }, addMacro: function(name, createMacro) { var self = this; var nameTree; nameTree = self.nameNode(name); return nameTree["create macro"] = createMacro; }, addWildCardMacro: function(name, matchMacro) { var self = this; var nameTree, matchMacros; nameTree = self.nameNode(name); matchMacros = void 0; if (!nameTree.hasOwnProperty("match macro")) { matchMacros = nameTree["match macro"] = []; } else { matchMacros = nameTree["match macro"]; } return matchMacros.push(matchMacro); }, findMacro: function(name) { var self = this; var findMatchingWildMacro, findMacroInTree; findMatchingWildMacro = function(wildMacros, name) { var n, wildMacro, macro; n = 0; while (n < wildMacros.length) { wildMacro = wildMacros[n]; macro = wildMacro(name); if (macro) { return macro; } ++n; } return void 0; }; findMacroInTree = function(nameTree, name, index, wildMacros) { var subtree; if (index < name.length) { if (nameTree.hasOwnProperty(name[index])) { subtree = nameTree[name[index]]; if (subtree.hasOwnProperty("match macro")) { wildMacros = subtree["match macro"].concat(wildMacros); } return findMacroInTree(subtree, name, index + 1, wildMacros); } else { return findMatchingWildMacro(wildMacros, name); } } else { if (nameTree.hasOwnProperty("create macro")) { return nameTree["create macro"]; } else { return findMatchingWildMacro(wildMacros, name); } } }; return findMacroInTree(self.nameTreeRoot, name, 0, []); } }); return createMacroDirectory = function() { var args = Array.prototype.slice.call(arguments, 0, arguments.length); var gen1_c; gen1_c = function() { macroDirectory.apply(this, args); }; gen1_c.prototype = macroDirectory.prototype; return new gen1_c(); }; }; }).call(this);