on d178521 help sign in
138 lines 4.0 kB history raw
2var ElmJSON = function() {
3 var JS = Foreign.JavaScript;
4 var empty = ['JSON',{}];
5 function singleton(k) { return function(v) {
6 var obj = {};
7 obj[JS.castStringToJSString(k)] = v;
8 return ['JSON', obj ];
9 };
10 }
11 function insert(k) { return function(v) { return function(inObj) {
12 var obj = inObj[1];
13 var outObj = {};
14 for (var i in obj) {
15 outObj[i] = obj[i];
16 }
17 outObj[JS.castStringToJSString(k)] = v;
18 return ['JSON', outObj ];
19 };
20 };
21 }
22 function lookup(key) { return function(obj) {
23 var k = JS.castStringToJSString(key);
24 return obj[1].hasOwnProperty(k) ? Just(obj[1][k]) : Nothing ;
25 };
26 }
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 ;
30 };
31 };
32 }
33 function remove(k) { return function(inObj) {
34 var obj = inObj[1];
35 var outObj = {};
36 for (var i in obj) {
37 outObj[i] = obj[i];
38 }
39 delete outObj[JS.castStringToJSString(k)];
40 return ['JSON', outObj];
41 };
42 }
44 function JsonString(v) { return [ "JsonString", v ]; }
45 function JsonNumber(v) { return [ "JsonNumber", v ]; }
46 function JsonBool(v) { return [ "JsonBool", v ]; }
47 var JsonNull = [ "JsonNull" ];
48 function JsonArray(v) { return [ "JsonArray", v ]; }
49 function JsonObject(v) { return [ "JsonObject", v ]; }
51 function toList(json) {
52 var obj = json[1];
53 var arr = [];
54 for (var i in obj) {
55 arr.push(Value.Tuple(JS.castJSStringToString(i), obj[i]));
56 }
57 return JS.castJSArrayToList(arr);
58 }
59 function fromList(list) {
60 var arr = JS.castListToJSArray(list);
61 var obj = {};
62 for (var i = arr.length; i--; ) {
63 obj[JS.castStringToJSString(arr[i][1])] = arr[i][2];
64 }
65 return [ "JSON", obj ];
66 }
68 function toPrettyJSString(sep) { return function (obj) {
69 function fromValue(v) {
70 switch (v[0]) {
71 case 'JsonNull' : return null;
72 case 'JsonString' : return JS.castStringToJSString(v[1]);
73 case 'JsonObject' :
74 var o = {};
75 var from = v[1][1];
76 for (var i in from) {
77 o[i] = fromValue(from[i]);
78 }
79 return o;
80 case 'JsonArray' :
81 var a = JS.castListToJSArray(v[1]);
82 for (var i = a.length; i--; ) {
83 a[i] = fromValue(a[i]);
84 }
85 return a;
86 default :
87 return v[1];
88 }
89 }
90 return JSON.stringify(fromValue([ 'JsonObject', obj ]), null, JS.castStringToJSString(sep));
91 };
92 }
93 function fromJSString(str) {
94 var obj = JSON.parse(str);
95 function toValue(v) {
96 switch (typeof v) {
97 case 'string' : return [ "JsonString", JS.castJSStringToString(v) ];
98 case 'number' : return [ "JsonNumber", JS.castJSNumberToFloat(v) ];
99 case 'boolean' : return [ "JsonBool", JS.castJSBoolToBool(v) ];
100 case 'object' :
101 if (v === null) return [ "JsonNull" ];
102 for (var i in v) {
103 v[i] = toValue(v[i]);
104 }
105 if (v instanceof Array) return [ "JsonArray", JS.castJSArrayToList(v) ];
106 return [ "JsonObject", [ "JSON", v ] ];
107 }
108 }
109 for (var i in obj) {
110 obj[i] = toValue(obj[i]);
111 }
112 return ['JSON',obj];
113 }
114 return {empty : empty,
115 singleton : singleton,
116 insert : insert,
117 lookup : lookup,
118 findWithDefault : lookupWithDefault,
119 remove : remove,
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)); },
127 toList : toList,
128 fromList : fromList,
129 JsonString : JsonString,
130 JsonNumber : JsonNumber,
131 JsonBool : JsonBool,
132 JsonNull : JsonNull,
133 JsonArray : JsonArray,
134 JsonObject : JsonObject
135 };
136}();
138Foreign.JavaScript.JSON = ElmJSON;