Skip to content

Instantly share code, notes, and snippets.

@marcoslhc
Forked from yelouafi/adt.js
Created January 14, 2017 02:20
Show Gist options
  • Save marcoslhc/e05806473c9112ff993a7953b5b4c31f to your computer and use it in GitHub Desktop.
Save marcoslhc/e05806473c9112ff993a7953b5b4c31f to your computer and use it in GitHub Desktop.
Algebraic Data Types in javascript (see http://tech.pro/blog/6885/javascript-and-type-thinking)
function eachKey(obj, f) {
for(var key in obj) {
if( obj.hasOwnProperty(key) )
f(key, obj[key]);
}
}
function adtcase (base, proto, key) {
return (...args) => {
var inst = new base();
eachKey(proto(...args), (key, val) => { inst[key] = val })
inst['is'+key] = true;
return inst;
}
}
function adt(base, variants) {
eachKey(variants, (key, v) => {
if(typeof v === 'function')
base[key] = adtcase(base, v, key);
else {
base[key] = v;
v['is'+key] = true;
}
})
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment