Skip to content

Instantly share code, notes, and snippets.

@michaelficarra
michaelficarra / pascalsTriangleRow
Created February 23, 2024 00:16
generate a row of Pascal's triangle in linear time and constant space
function* pascalsTriangleRow(row) {
let prev = 1;
for(let i = 1; i <= row; ++i) {
yield prev;
prev = (prev * (row - (i - 1))) / i;
}
yield 1;
}
Array.from(pascalsTriangleRow(19));
@michaelficarra
michaelficarra / once.js
Last active August 4, 2019 07:43
a loose approximation of a potential Function.prototype.once
Function.prototype.once = function () {
let fn = this;
let called = false;
return function() {
if (!called) {
called = true;
return fn.apply(this, arguments);
}
};
};
@michaelficarra
michaelficarra / index.js
Created November 15, 2018 22:16
capabilities
const safeApply = Date.call.bind(Date.apply);
const randomName = () => Math.random().toString(36).slice(2).toLowerCase();
class RevokedCapabilityException extends Error {}
class Capability {
constructor(behaviour, { name = randomName() } = {}) {
this.behaviour = behaviour;
this.name = Object.freeze([].concat(name));
}
@michaelficarra
michaelficarra / SetUsingHashCode.js
Last active June 10, 2017 17:35
Set using hashCode via ECMAScript interfaces proposal
// https://github.com/michaelficarra/ecmascript-interfaces-proposal
interface HasHashCode {
hashCode;
}
class SetUsingHashCode extends Set {
constructor(iterable) {
super();
this.#map = new Map;
for (let x of iterable) {
diff --git c/purescript.cabal i/purescript.cabal
index 4f4fcabd..699e8440 100644
--- c/purescript.cabal
+++ i/purescript.cabal
@@ -231,6 +231,7 @@ library
Language.PureScript.Sugar.TypeClasses
Language.PureScript.Sugar.TypeClasses.Deriving
Language.PureScript.Sugar.TypeDeclarations
+ Language.PureScript.Terms
Language.PureScript.Traversals
@michaelficarra
michaelficarra / append-template-tag.js
Created May 30, 2016 14:29
chainable template tag for joining a bunch of strings over many lines
function append(separator) {
return typeof separator === "string" ? appender(separator, "") : appender("", "").apply(this, arguments);
}
function appender(separator, s) {
return function tag(literalParts, ...computedParts) {
s += literalParts[0];
for (let i = 1; i < literalParts.length; ++i) {
s += computedParts[i - 1] + literalParts[i];
}
@michaelficarra
michaelficarra / getGlobal.js
Last active June 2, 2016 16:16
get the global object as reliably as possible
var getGlobal = (function(g) {
if (g == null) {
if (typeof System !== 'undefined' && System != null && System.global != null && System.global.System === System) g = System.global;
else if (typeof self !== 'undefined' && self != null && self.self === self) g = self;
else if (typeof window !== 'undefined' && window != null && window.window === window) g = window;
else if (typeof global !== 'undefined' && global != null && global.global === global) g = global;
}
return function() { return g; };
}(this));
commit e6284b9bd6977ca282bdf13d13fab4d8bf6be71b
Normative: Add [?Yield] to PropertyName in AssignmentProperty
commit f0ef98ae9ecdfd1ed1e14721e795f6188a3107ee
Normative: Fix yield * semantics when calling .throw
commit 6ba35eb8fb9aad699efdd1766c52bc9f6401d039
Normative: update Annex B regexp grammar
commit d96e60a99a40fab2de0df329b3e5445ac27b8a8e
Normative: Remove [[Enumerate]] and associated reflective capabilities
commit 24dad16327b7cbbdf67805e45e58c54abe558f63
Normative: Require Unicode 8.0.0
$ eshost host --list
┌──────────────┬─────────┬──────────────────────────────────────────────────┬──────┐
│ name │ type │ path │ args │
├──────────────┼─────────┼──────────────────────────────────────────────────┼──────┤
│ nashorn │ nashorn │ /usr/java/jdk1.8.0_66/bin/jjs │ │
├──────────────┼─────────┼──────────────────────────────────────────────────┼──────┤
│ v8 │ d8 │ /usr/bin/d8 │ │
├──────────────┼─────────┼──────────────────────────────────────────────────┼──────┤
│ jsc │ jsc │ /usr/bin/jsc │ │
├──────────────┼─────────┼──────────────────────────────────────────────────┼──────┤
@michaelficarra
michaelficarra / rt.js
Last active February 1, 2016 01:47
Rotten Tomatoes ratings exfiltrator
console.log(JSON.stringify([].map.call(document.querySelectorAll('.content_body .media-body'), function(ratingEl){
return {
title: ratingEl.childNodes[3].childNodes[1].textContent,
year: parseInt(ratingEl.childNodes[3].childNodes[2].textContent.slice(1, -1), 10),
rt_link: ratingEl.childNodes[3].childNodes[1].href,
rating: 20 * ratingEl.childNodes[5].querySelectorAll('.glyphicon-star').length + (/½/.test(ratingEl.childNodes[5].textContent) ? 10 : 0),
};
}).sort(function(a, b){ return a.title > b.title ? 1 : -1; })));