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