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