@@ -0,0 +1,138 @@
2+var ElmJSON = function() {
3+ var JS = Foreign.JavaScript;
4+ var empty = ['JSON',{}];
5+ function singleton(k) { return function(v) {
7+ obj[JS.castStringToJSString(k)] = v;
8+ return ['JSON', obj ];
11+ function insert(k) { return function(v) { return function(inObj) {
17+ outObj[JS.castStringToJSString(k)] = v;
18+ return ['JSON', outObj ];
22+ function lookup(key) { return function(obj) {
23+ var k = JS.castStringToJSString(key);
24+ return obj[1].hasOwnProperty(k) ? Just(obj[1][k]) : Nothing ;
27+ function lookupWithDefault(base) { return function(key) { return function(obj) {
28+ var k = JS.castStringToJSString(key);
29+ return obj[1].hasOwnProperty(k) ? obj[1][k] : base ;
33+ function remove(k) { return function(inObj) {
39+ delete outObj[JS.castStringToJSString(k)];
40+ return ['JSON', outObj];
44+ function JSString(v) { return [ "JSString", v ]; }
45+ function JSNumber(v) { return [ "JSNumber", v ]; }
46+ function JSBool(v) { return [ "JSBool", v ]; }
47+ var JSNull = [ "JSNull" ];
48+ function JSArray(v) { return [ "JSArray", v ]; }
49+ function JSObject(v) { return [ "JSObject", v ]; }
51+ function toList(json) {
55+ arr.push(Value.Tuple(JS.castJSStringToString(i), obj[i]));
57+ return JS.castJSArrayToList(arr);
59+ function fromList(list) {
60+ var arr = JS.castListToJSArray(list);
62+ for (var i = arr.length; i--; ) {
63+ obj[JS.castStringToJSString(arr[i][1])] = arr[i][2];
65+ return [ "JSON", obj ];
68+ function toPrettyJSString(sep) { return function (obj) {
69+ function fromValue(v) {
71+ case 'JSNull' : return null;
72+ case 'JSString' : return JS.castStringToJSString(v[1]);
76+ for (var i in from) {
77+ o[i] = fromValue(from[i]);
81+ var a = JS.castListToJSArray(v[1]);
82+ for (var i = a.length; i--; ) {
83+ a[i] = fromValue(a[i]);
90+ return JSON.stringify(fromValue([ 'JSObject', obj ]), null, JS.castStringToJSString(sep));
93+ function fromJSString(str) {
94+ var obj = JSON.parse(str);
95+ function toValue(v) {
97+ case 'string' : return [ "JSString", JS.castJSStringToString(v) ];
98+ case 'number' : return [ "JSNumber", JS.castJSNumberToFloat(v) ];
99+ case 'boolean' : return [ "JSBool", JS.castJSBoolToBool(v) ];
101+ if (v === null) return [ "JSNull" ];
103+ v[i] = toValue(v[i]);
105+ if (v instanceof Array) return [ "JSArray", JS.castJSArrayToList(v) ];
106+ return [ "JSObject", [ "JSON", v ] ];
109+ for (var i in obj) {
110+ obj[i] = toValue(obj[i]);
112+ return ['JSON',obj];
114+ return {empty : empty,
115+ singleton : singleton,
118+ lookupWithDefault : lookupWithDefault,
120+ toPrettyJSString : toPrettyJSString,
121+ toJSString : toPrettyJSString(''),
122+ fromJSString : fromJSString,
123+ toPrettyString : function(sep) { return function(v) {
124+ return JS.castJSStringToString(toPrettyJSString(sep)(v)); }; },
125+ toString : function(v) { return JS.castJSStringToString(toPrettyJSString('')(v)); },
126+ fromString : function(v) { return fromJSString(JS.castStringToJSString(v)); },
128+ fromList : fromList,
129+ JSString : JSString,
130+ JSNumber : JSNumber,
138+Foreign.JavaScript.JSON = ElmJSON;