Skip to content

Instantly share code, notes, and snippets.

@eupharis
Created December 24, 2012 19:57
Show Gist options
  • Save eupharis/4370507 to your computer and use it in GitHub Desktop.
Save eupharis/4370507 to your computer and use it in GitHub Desktop.
/*ELOQUENT JAVASCRIPT*/
// forEach
function forEach(array, action) {
for (var i = 0; i < array.length; i++)
action(array[i]);
}
// map
function map(func, array) {
var result = [];
forEach(array, function (element) {
result.push(func(element));
});
return result;
}
// reduce
function reduce(combine, base, array) {
forEach(array, function (element) {
base = combine(base, element);
});
return base;
}
// tag
function tag(name, content, attributes) {
return {name: name, attributes: attributes, content: content};
}
function link(target, text) {
return tag("a", [text], {href: target});
}
function htmlDoc(title, bodyContent) {
return tag("html", [tag("head", [tag("title", [title])]),
tag("body", bodyContent)]);
}
// HTML renderer
function escapeHTML(text) {
var replacements = [[/&/g, "&amp;"], [/"/g, "&quot;"],
[/</g, "&lt;"], [/>/g, "&gt;"]];
forEach(replacements, function(replace) {
text = text.replace(replace[0], replace[1]);
});
return text;
}
function renderAttributes(attributes) {
if (attributes === null) return "";
var result = [];
for (var name in attributes)
if (attributes.hasOwnProperty(name))
result.push(" " + name + "=\"" + escapeHTML(attributes[name]) + "\"");
return result.join("");
}
function renderHTML(element) {
var pieces = [];
function render(element) {
// Text node
if (typeof element == "string") {
pieces.push(element);//escapeHTML(element));
}
// Empty tag
else if (!element.content || element.content.length === 0) {
pieces.push("<" + element.name +
renderAttributes(element.attributes) + ">");
}
// Tag with content
else {
pieces.push("<" + element.name +
renderAttributes(element.attributes) + ">");
forEach(element.content, render);
pieces.push("</" + element.name + ">");
}
}
render(element);
return pieces.join("");
}
// op object
var op = {
  "+": function(a, b){return a + b;},
  "==": function(a, b){return a == b;},
  "===": function(a, b){return a === b;},
  "!": function(a){return !a;},
">": function(a, b){return a > b;}
/* and so on */
};
// partial application
function partial(func) {
  var i;
var knownArgs = arguments;
  return function() {
    var realArgs = [];
    for (i = 1; i < knownArgs.length; i++)
      realArgs.push(knownArgs[i]);
    for (i = 0; i < arguments.length; i++)
      realArgs.push(arguments[i]);
    return func.apply(null, realArgs);
  };
}
// return new array based on test
function filter(test, array) {
  var result = [];
  forEach(array, function (element) {
  if (test(element))
    result.push(element);
  });
  return result;
}
function any(test, array) {
for (var i=0; i<array.length; i++) {
var found = test(array[i]);
if (found)
return false;
}
}
function every(test, array) {
for (var i=0; i<array.length; i++) {
var found = test(array[i]);
if (!found)
return found;
}
return true;
}
function member(array, value) {
return any(partial(op["==="], value), array);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment