Add JSON library.

This commit is contained in:
evancz 2012-07-28 20:33:58 +02:00
parent 39f00d8b6b
commit b6806c5d48

138
core-js/foreign/JSON.js Normal file
View file

@ -0,0 +1,138 @@
var ElmJSON = function() {
var JS = Foreign.JavaScript;
var empty = ['JSON',{}];
function singleton(k) { return function(v) {
var obj = {};
obj[JS.castStringToJSString(k)] = v;
return ['JSON', obj ];
};
}
function insert(k) { return function(v) { return function(inObj) {
var obj = inObj[1];
var outObj = {};
for (var i in obj) {
outObj[i] = obj[i];
}
outObj[JS.castStringToJSString(k)] = v;
return ['JSON', outObj ];
};
};
}
function lookup(key) { return function(obj) {
var k = JS.castStringToJSString(key);
return obj[1].hasOwnProperty(k) ? Just(obj[1][k]) : Nothing ;
};
}
function lookupWithDefault(base) { return function(key) { return function(obj) {
var k = JS.castStringToJSString(key);
return obj[1].hasOwnProperty(k) ? obj[1][k] : base ;
};
};
}
function remove(k) { return function(inObj) {
var obj = inObj[1];
var outObj = {};
for (var i in obj) {
outObj[i] = obj[i];
}
delete outObj[JS.castStringToJSString(k)];
return ['JSON', outObj];
};
}
function JSString(v) { return [ "JSString", v ]; }
function JSNumber(v) { return [ "JSNumber", v ]; }
function JSBool(v) { return [ "JSBool", v ]; }
var JSNull = [ "JSNull" ];
function JSArray(v) { return [ "JSArray", v ]; }
function JSObject(v) { return [ "JSObject", v ]; }
function toList(json) {
var obj = json[1];
var arr = [];
for (var i in obj) {
arr.push(Value.Tuple(JS.castJSStringToString(i), obj[i]));
}
return JS.castJSArrayToList(arr);
}
function fromList(list) {
var arr = JS.castListToJSArray(list);
var obj = {};
for (var i = arr.length; i--; ) {
obj[JS.castStringToJSString(arr[i][1])] = arr[i][2];
}
return [ "JSON", obj ];
}
function toPrettyJSString(sep) { return function (obj) {
function fromValue(v) {
switch (v[0]) {
case 'JSNull' : return null;
case 'JSString' : return JS.castStringToJSString(v[1]);
case 'JSObject' :
var o = {};
var from = v[1][1];
for (var i in from) {
o[i] = fromValue(from[i]);
}
return o;
case 'JSArray' :
var a = JS.castListToJSArray(v[1]);
for (var i = a.length; i--; ) {
a[i] = fromValue(a[i]);
}
return a;
default :
return v[1];
}
}
return JSON.stringify(fromValue([ 'JSObject', obj ]), null, JS.castStringToJSString(sep));
};
}
function fromJSString(str) {
var obj = JSON.parse(str);
function toValue(v) {
switch (typeof v) {
case 'string' : return [ "JSString", JS.castJSStringToString(v) ];
case 'number' : return [ "JSNumber", JS.castJSNumberToFloat(v) ];
case 'boolean' : return [ "JSBool", JS.castJSBoolToBool(v) ];
case 'object' :
if (v === null) return [ "JSNull" ];
for (var i in v) {
v[i] = toValue(v[i]);
}
if (v instanceof Array) return [ "JSArray", JS.castJSArrayToList(v) ];
return [ "JSObject", [ "JSON", v ] ];
}
}
for (var i in obj) {
obj[i] = toValue(obj[i]);
}
return ['JSON',obj];
}
return {empty : empty,
singleton : singleton,
insert : insert,
lookup : lookup,
lookupWithDefault : lookupWithDefault,
remove : remove,
toPrettyJSString : toPrettyJSString,
toJSString : toPrettyJSString(''),
fromJSString : fromJSString,
toPrettyString : function(sep) { return function(v) {
return JS.castJSStringToString(toPrettyJSString(sep)(v)); }; },
toString : function(v) { return JS.castJSStringToString(toPrettyJSString('')(v)); },
fromString : function(v) { return fromJSString(JS.castStringToJSString(v)); },
toList : toList,
fromList : fromList,
JSString : JSString,
JSNumber : JSNumber,
JSBool : JSBool,
JSNull : JSNull,
JSArray : JSArray,
JSObject : JSObject
};
}();
Foreign.JavaScript.JSON = ElmJSON;