Add JSON library.
This commit is contained in:
parent
39f00d8b6b
commit
b6806c5d48
1 changed files with 138 additions and 0 deletions
138
core-js/foreign/JSON.js
Normal file
138
core-js/foreign/JSON.js
Normal 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;
|
Loading…
Reference in a new issue