function isNull(obj) {
return obj === null;
}
function jsRead(str) {
return Number(str);
}
function jsShowI(val) {return val.toString();}
function jsShow(val) {
var ret = val.toString();
return val == Math.round(val) ? ret + '.0' : ret;
}
window['jsGetMouseCoords'] = function jsGetMouseCoords(e) {
var posx = 0;
var posy = 0;
if (!e) var e = window.event;
if (e.pageX || e.pageY) {
posx = e.pageX;
posy = e.pageY;
}
else if (e.clientX || e.clientY) {
posx = e.clientX + document.body.scrollLeft
+ document.documentElement.scrollLeft;
posy = e.clientY + document.body.scrollTop
+ document.documentElement.scrollTop;
}
return [posx - (e.currentTarget.offsetLeft || 0),
posy - (e.currentTarget.offsetTop || 0)];
}
var jsRand = Math.random;
// Concatenate a Haskell list of JS strings
function jsCat(strs, sep) {
var arr = [];
strs = E(strs);
while(strs._) {
strs = E(strs);
arr.push(E(strs.a));
strs = E(strs.b);
}
return arr.join(sep);
}
// Parse a JSON message into a Haste.JSON.JSON value.
// As this pokes around inside Haskell values, it'll need to be updated if:
// * Haste.JSON.JSON changes;
// * E() starts to choke on non-thunks;
// * data constructor code generation changes; or
// * Just and Nothing change tags.
function jsParseJSON(str) {
try {
var js = JSON.parse(str);
var hs = toHS(js);
} catch(_) {
return __Z;
}
return {_:1,a:hs};
}
function toHS(obj) {
switch(typeof obj) {
case 'number':
return {_:0, a:jsRead(obj)};
case 'string':
return {_:1, a:obj};
case 'boolean':
return {_:2, a:obj}; // Booleans are special wrt constructor tags!
case 'object':
if(obj instanceof Array) {
return {_:3, a:arr2lst_json(obj, 0)};
} else if (obj == null) {
return {_:5};
} else {
// Object type but not array - it's a dictionary.
// The RFC doesn't say anything about the ordering of keys, but
// considering that lots of people rely on keys being "in order" as
// defined by "the same way someone put them in at the other end,"
// it's probably a good idea to put some cycles into meeting their
// misguided expectations.
var ks = [];
for(var k in obj) {
ks.unshift(k);
}
var xs = [0];
for(var i = 0; i < ks.length; i++) {
xs = {_:1, a:{_:0, a:ks[i], b:toHS(obj[ks[i]])}, b:xs};
}
return {_:4, a:xs};
}
}
}
function arr2lst_json(arr, elem) {
if(elem >= arr.length) {
return __Z;
}
return {_:1, a:toHS(arr[elem]), b:new T(function() {return arr2lst_json(arr,elem+1);}),c:true}
}
/* gettimeofday(2) */
function gettimeofday(tv, _tz) {
var t = new Date().getTime();
writeOffAddr("i32", 4, tv, 0, (t/1000)|0);
writeOffAddr("i32", 4, tv, 1, ((t%1000)*1000)|0);
return 0;
}