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