2012-07-28 18:33:58 +00:00
|
|
|
|
2012-10-16 06:03:14 +00:00
|
|
|
var Elm = Elm || {};
|
|
|
|
Elm.JSON = function() {
|
|
|
|
var JS = Elm.JavaScript;
|
2012-07-28 18:33:58 +00:00
|
|
|
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];
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2012-07-28 20:59:31 +00:00
|
|
|
function JsonString(v) { return [ "JsonString", v ]; }
|
|
|
|
function JsonNumber(v) { return [ "JsonNumber", v ]; }
|
|
|
|
function JsonBool(v) { return [ "JsonBool", v ]; }
|
|
|
|
var JsonNull = [ "JsonNull" ];
|
|
|
|
function JsonArray(v) { return [ "JsonArray", v ]; }
|
|
|
|
function JsonObject(v) { return [ "JsonObject", v ]; }
|
2012-07-28 18:33:58 +00:00
|
|
|
|
|
|
|
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]) {
|
2012-07-28 20:59:31 +00:00
|
|
|
case 'JsonNull' : return null;
|
|
|
|
case 'JsonString' : return JS.castStringToJSString(v[1]);
|
|
|
|
case 'JsonObject' :
|
2012-07-28 18:33:58 +00:00
|
|
|
var o = {};
|
|
|
|
var from = v[1][1];
|
|
|
|
for (var i in from) {
|
|
|
|
o[i] = fromValue(from[i]);
|
|
|
|
}
|
|
|
|
return o;
|
2012-07-28 20:59:31 +00:00
|
|
|
case 'JsonArray' :
|
2012-07-28 18:33:58 +00:00
|
|
|
var a = JS.castListToJSArray(v[1]);
|
|
|
|
for (var i = a.length; i--; ) {
|
|
|
|
a[i] = fromValue(a[i]);
|
|
|
|
}
|
|
|
|
return a;
|
|
|
|
default :
|
|
|
|
return v[1];
|
|
|
|
}
|
|
|
|
}
|
2012-08-14 13:07:04 +00:00
|
|
|
return JSON.stringify(fromValue([ 'JsonObject', obj ]), null, JS.castStringToJSString(sep));
|
2012-07-28 18:33:58 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
function fromJSString(str) {
|
|
|
|
var obj = JSON.parse(str);
|
|
|
|
function toValue(v) {
|
|
|
|
switch (typeof v) {
|
2012-07-28 20:59:31 +00:00
|
|
|
case 'string' : return [ "JsonString", JS.castJSStringToString(v) ];
|
|
|
|
case 'number' : return [ "JsonNumber", JS.castJSNumberToFloat(v) ];
|
|
|
|
case 'boolean' : return [ "JsonBool", JS.castJSBoolToBool(v) ];
|
2012-07-28 18:33:58 +00:00
|
|
|
case 'object' :
|
2012-07-28 20:59:31 +00:00
|
|
|
if (v === null) return [ "JsonNull" ];
|
2012-07-28 18:33:58 +00:00
|
|
|
for (var i in v) {
|
|
|
|
v[i] = toValue(v[i]);
|
|
|
|
}
|
2012-07-28 20:59:31 +00:00
|
|
|
if (v instanceof Array) return [ "JsonArray", JS.castJSArrayToList(v) ];
|
|
|
|
return [ "JsonObject", [ "JSON", v ] ];
|
2012-07-28 18:33:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
for (var i in obj) {
|
|
|
|
obj[i] = toValue(obj[i]);
|
|
|
|
}
|
|
|
|
return ['JSON',obj];
|
|
|
|
}
|
|
|
|
return {empty : empty,
|
|
|
|
singleton : singleton,
|
|
|
|
insert : insert,
|
|
|
|
lookup : lookup,
|
2012-08-14 12:10:24 +00:00
|
|
|
findWithDefault : lookupWithDefault,
|
2012-07-28 18:33:58 +00:00
|
|
|
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,
|
2012-07-28 20:59:31 +00:00
|
|
|
JsonString : JsonString,
|
|
|
|
JsonNumber : JsonNumber,
|
|
|
|
JsonBool : JsonBool,
|
|
|
|
JsonNull : JsonNull,
|
|
|
|
JsonArray : JsonArray,
|
|
|
|
JsonObject : JsonObject
|
2012-07-28 18:33:58 +00:00
|
|
|
};
|
2012-10-16 06:03:14 +00:00
|
|
|
}();
|