Created
July 15, 2015 20:33
-
-
Save wavebeem/489580d3b95fdf8cfea3 to your computer and use it in GitHub Desktop.
A simple addition calculator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta charset="UTF-8"> | |
<title>Wobsite</title> | |
</head> | |
<body> | |
<h1>Wobsite</h1> | |
<input type="number" id="number-1" value="1"> | |
<input type="number" id="number-2" value="2"> | |
<span id="sum"></span> | |
<script>var module = {};</script> | |
<script src="main.js"></script> | |
<script>module.exports.main();</script> | |
</body> | |
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var global = (1, eval)('this'); | |
var print = function (x) { | |
return LANG$$log(x); | |
}; | |
var not = function (x) { | |
return !!x; | |
}; | |
var $lt = function (a, b) { | |
var ta = typeof a; | |
var tb = typeof b; | |
if (ta === tb && (ta === 'string' || ta === 'number')) { | |
return a < b; | |
} | |
throw new LANG$$js_Error('incorrect argument types for <'); | |
}; | |
var $gt = function (a, b) { | |
var ta = typeof a; | |
var tb = typeof b; | |
if (ta === tb && (ta === 'string' || ta === 'number')) { | |
return a > b; | |
} | |
throw new LANG$$js_Error('incorrect argument types for >'); | |
}; | |
var $lt$eq = function (a, b) { | |
return $lt(a, b) || a === b; | |
}; | |
var $gt$eq = function (a, b) { | |
return $gt(a, b) || a === b; | |
}; | |
var $bang$eq = function (a, b) { | |
return not($eq(a, b)); | |
}; | |
var not = function (x) { | |
return !LANG$$assert_boolean(x); | |
}; | |
var $pipe$gt = function (x, f) { | |
if (typeof f !== 'function') { | |
throw new LANG$$js_Error('right-side not a function in |>'); | |
} | |
return f(x); | |
}; | |
var $at = function (f, x) { | |
if (typeof f !== 'function') { | |
throw new LANG$$js_Error('left-side not a function in @'); | |
} | |
return f.bind(null, x); | |
}; | |
var $ampersand = function (a, b) { | |
if (arguments.length !== 2) { | |
throw new LANG$$js_Error('wrong number of arguments for &'); | |
} | |
return LANG$$assert_boolean(a) && LANG$$assert_boolean(b); | |
}; | |
var $semicolon = function (a, b) { | |
return b; | |
}; | |
var $pipe = function (a, b) { | |
if (arguments.length !== 2) { | |
throw new LANG$$js_Error('wrong number of arguments for |'); | |
} | |
return LANG$$assert_boolean(a) || LANG$$assert_boolean(b); | |
}; | |
var is = function recur(a, b) { | |
if (typeof a !== typeof b) { | |
return false; | |
} | |
if (a === b) { | |
return true; | |
} | |
if (a !== a && b !== b) { | |
return true; | |
} | |
if (LANG$$is_object(a) && LANG$$is_object(b)) { | |
var ks = LANG$$keys(a).concat(LANG$$keys(b)).sort(); | |
return ks.every(function (k) { | |
return k in a && k in b && recur(a[k], b[k]); | |
}); | |
} | |
return false; | |
}; | |
var $eq = is; | |
var $plus = function (a, b) { | |
if (typeof a === 'number' && typeof b === 'number') { | |
return a + b; | |
} | |
throw new LANG$$js_Error('incorrect argument types for +'); | |
}; | |
var $plus$plus = function (a, b) { | |
var A = Array.isArray; | |
var S = function (x) { | |
return typeof x === 'string'; | |
}; | |
var aOk = A(a) && A(b); | |
var sOk = S(a) && S(b); | |
if (aOk || sOk) { | |
return a.concat(b); | |
} | |
throw new LANG$$js_Error('incorrect argument types for ++'); | |
}; | |
var $minus = function (a, b) { | |
return a - b; | |
}; | |
var $star = function (a, b) { | |
return a * b; | |
}; | |
var $slash = function (a, b) { | |
return a / b; | |
}; | |
var map = function (f, xs) { | |
return xs.map(function (x) { | |
return f(x); | |
}); | |
}; | |
var fold_left = function (f, z, xs) { | |
xs.forEach(function (x) { | |
z = f(z, x); | |
}); | |
return z; | |
}; | |
var is_empty = function (xs) { | |
return xs.length === 0; | |
}; | |
var head = function (xs) { | |
if (!is_empty(xs)) { | |
return xs[0]; | |
} | |
throw new LANG$$js_Error('cannot get head of empty list'); | |
}; | |
var tail = function (xs) { | |
return [].slice.call(xs, 1); | |
}; | |
var reduce = function (f, xs) { | |
return fold_left(f, head(xs), tail(xs)); | |
}; | |
var fold_right = function (f, z, xs) { | |
return fold_left(flip(f), z, reverse(xs)); | |
}; | |
var reverse = function (xs) { | |
return to_array(xs).reverse(); | |
}; | |
var to_array = function (xs) { | |
return [].slice.call(xs); | |
}; | |
var flip = function (f) { | |
return function (x, y) { | |
return f(y, x); | |
}; | |
}; | |
var js_get = function (k, obj) { | |
if (k in obj) { | |
return obj[k]; | |
} | |
throw new LANG$$js_Error('key ' + k + ' not in ' + obj); | |
}; | |
var js_set = function (k, v, obj) { | |
if (obj === null || typeof obj !== 'object') { | |
throw new LANG$$js_Error('cannot set ' + k + ' on ' + obj); | |
} | |
obj[k] = v; | |
return obj; | |
}; | |
var js_method_get = function (method, obj) { | |
return obj[method].bind(obj); | |
}; | |
var js_method_call = function (method, obj, args) { | |
return obj[method].apply(obj, args); | |
}; | |
var LANG$$object = function (data) { | |
if (!LANG$$is_array(data)) { | |
throw new LANG$$js_Error('objects can only be constructed from an array'); | |
} | |
var obj = {}; | |
var i = 0; | |
var n = data.length; | |
while (i < n) { | |
if (typeof data[i][0] !== 'string') { | |
throw new LANG$$js_Error('object keys must be strings: ' + data[i]); | |
} | |
obj[data[i][0]] = data[i][1]; | |
i++; | |
} | |
return LANG$$freeze(obj); | |
}; | |
var LANG$$is_object = function (x) { | |
if (arguments.length !== 1) { | |
throw new LANG$$js_Error('wrong number of arguments to LANG$$is_object'); | |
} | |
return x !== null && typeof x === 'object'; | |
}; | |
var LANG$$assert_boolean = function (x) { | |
if (typeof x !== 'boolean') { | |
throw new LANG$$js_Error('not a boolean: ' + x); | |
} | |
return x; | |
}; | |
var LANG$$freeze = Object.freeze; | |
var LANG$$create = Object.create; | |
var LANG$$is_array = Array.isArray; | |
var LANG$$keys = Object.keys; | |
var LANG$$js_get = js_get; | |
var LANG$$js_method_get = js_method_get; | |
var LANG$$js_method_call = js_method_call; | |
var LANG$$js_Error = Error; | |
var LANG$$custom_logger = null; | |
var LANG$$global = global; | |
var LANG$$log = function (x) { | |
if (LANG$$custom_logger) { | |
LANG$$custom_logger(x); | |
} else if (LANG$$global.console && LANG$$global.console.log) { | |
LANG$$global.console.log(x); | |
} | |
return x; | |
}; | |
module.exports = function () { | |
var byId = LANG$$js_method_get('getElementById', LANG$$js_get('document', global)); | |
var toNumber = function (x) { | |
if (arguments.length !== 1) { | |
throw new LANG$$js_Error('expected 1 argument(s), got ' + arguments.length); | |
} | |
return function () { | |
var y = LANG$$js_method_call('Number', global, LANG$$freeze([x])); | |
return $eq(y, NaN) ? 0 : y; | |
}(); | |
}; | |
var toNumber = LANG$$js_get('Number', global); | |
var listen = function (element, name, func) { | |
if (arguments.length !== 3) { | |
throw new LANG$$js_Error('expected 3 argument(s), got ' + arguments.length); | |
} | |
return $semicolon(LANG$$js_method_call('addEventListener', element, LANG$$freeze([ | |
name, | |
func, | |
false | |
])), undefined); | |
}; | |
var elements = LANG$$object([ | |
[ | |
'a', | |
byId('number-1') | |
], | |
[ | |
'b', | |
byId('number-2') | |
], | |
[ | |
'c', | |
byId('sum') | |
] | |
]); | |
var update = function () { | |
if (arguments.length !== 0) { | |
throw new LANG$$js_Error('expected 0 argument(s), got ' + arguments.length); | |
} | |
return function () { | |
var a = toNumber(LANG$$js_get('value', LANG$$js_get('a', elements))); | |
var b = toNumber(LANG$$js_get('value', LANG$$js_get('b', elements))); | |
return showSum(a, b); | |
}(); | |
}; | |
var updateHandler = function (_) { | |
if (arguments.length !== 1) { | |
throw new LANG$$js_Error('expected 1 argument(s), got ' + arguments.length); | |
} | |
return update(); | |
}; | |
var showSum = function (a, b) { | |
if (arguments.length !== 2) { | |
throw new LANG$$js_Error('expected 2 argument(s), got ' + arguments.length); | |
} | |
return js_set('textContent', $plus(a, b), LANG$$js_get('c', elements)); | |
}; | |
var main = function () { | |
if (arguments.length !== 0) { | |
throw new LANG$$js_Error('expected 0 argument(s), got ' + arguments.length); | |
} | |
return $semicolon($semicolon(listen(LANG$$js_get('a', elements), 'input', updateHandler), listen(LANG$$js_get('b', elements), 'input', updateHandler)), update()); | |
}; | |
return LANG$$object([[ | |
'main', | |
main | |
]]); | |
}(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let ( | |
byId = global.document::getElementById, | |
toNumber = ~( x | | |
let (y = global.Number(x)) | |
in if y = NaN | |
then 0 | |
else y | |
), | |
toNumber = global.Number, | |
listen = ~( element, name, func | | |
element.addEventListener(name, func, false); | |
undefined | |
), | |
elements = { | |
"a": byId("number-1"), | |
"b": byId("number-2"), | |
"c": byId("sum") | |
}, | |
update = ~(| | |
let ( | |
a = toNumber(elements.a.value), | |
b = toNumber(elements.b.value) | |
) in showSum(a, b) | |
), | |
updateHandler = ~( _ | update() ), | |
showSum = ~( a, b | | |
js_set("textContent", a + b, elements.c) | |
), | |
main = ~(| | |
listen(elements.a, "input", updateHandler); | |
listen(elements.b, "input", updateHandler); | |
update() | |
) | |
) in {"main": main} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment