on 09bbada help sign in
153 lines 4.5 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 }
25 function lookup(key) { return function(obj) {
26 var k = JS.castStringToJSString(key);
27 return obj[1].hasOwnProperty(k) ? Just(obj[1][k]) : Nothing ;
28 };
29 }
30 function find(tipe,base) { return function (key) { return function(obj) {
31 var k = JS.castStringToJSString(key);
32 if (obj[1].hasOwnProperty(k)) {
33 var v = obj[1][k];
34 if (v[0] === tipe) { return v[1]; }
35 }
36 return base;
37 };
38 }
39 }
40 function lookupWithDefault(base) { return function(key) { return function(obj) {
41 var k = JS.castStringToJSString(key);
42 return obj[1].hasOwnProperty(k) ? obj[1][k] : base ;
43 };
44 };
45 }
47 function remove(k) { return function(inObj) {
48 var obj = inObj[1];
49 var outObj = {};
50 for (var i in obj) {
51 outObj[i] = obj[i];
52 }
53 delete outObj[JS.castStringToJSString(k)];
54 return ['JSON', outObj];
55 };
56 }
58 function JsonString(v) { return [ "JsonString", v ]; }
59 function JsonNumber(v) { return [ "JsonNumber", v ]; }
60 function JsonBool(v) { return [ "JsonBool", v ]; }
61 var JsonNull = [ "JsonNull" ];
62 function JsonArray(v) { return [ "JsonArray", v ]; }
63 function JsonObject(v) { return [ "JsonObject", v ]; }
65 function toList(json) {
66 var obj = json[1];
67 var arr = [];
68 for (var i in obj) {
69 arr.push(Value.Tuple(JS.castJSStringToString(i), obj[i]));
70 }
71 return JS.castJSArrayToList(arr);
72 }
73 function fromList(list) {
74 var arr = JS.castListToJSArray(list);
75 var obj = {};
76 for (var i = arr.length; i--; ) {
77 obj[JS.castStringToJSString(arr[i][1])] = arr[i][2];
78 }
79 return [ "JSON", obj ];
80 }
82 function toPrettyJSString(sep) { return function (obj) {
83 function fromValue(v) {
84 switch (v[0]) {
85 case 'JsonNull' : return null;
86 case 'JsonString' : return JS.castStringToJSString(v[1]);
87 case 'JsonObject' :
88 var o = {};
89 var from = v[1][1];
90 for (var i in from) {
91 o[i] = fromValue(from[i]);
92 }
93 return o;
94 case 'JsonArray' :
95 var a = JS.castListToJSArray(v[1]);
96 for (var i = a.length; i--; ) {
97 a[i] = fromValue(a[i]);
98 }
99 return a;
100 default :
101 return v[1];
102 }
103 }
104 return JSjson.stringify(fromValue([ 'JsonObject', obj ]), null, JS.castStringToJSString(sep));
105 };
106 }
107 function fromJSString(str) {
108 var obj = JSjson.parse(str);
109 function toValue(v) {
110 switch (typeof v) {
111 case 'string' : return [ "JsonString", JS.castJSStringToString(v) ];
112 case 'number' : return [ "JsonNumber", JS.castJSNumberToFloat(v) ];
113 case 'boolean' : return [ "JsonBool", JS.castJSBoolToBool(v) ];
114 case 'object' :
115 if (v === null) return [ "JsonNull" ];
116 for (var i in v) {
117 v[i] = toValue(v[i]);
118 }
119 if (v instanceof Array) return [ "JsonArray", JS.castJSArrayToList(v) ];
120 return [ "JsonObject", [ "JSON", v ] ];
121 }
122 }
123 for (var i in obj) {
124 obj[i] = toValue(obj[i]);
125 }
126 return ['JSON',obj];
127 }
128 return {empty : empty,
129 singleton : singleton,
130 insert : insert,
131 lookup : lookup,
132 findString : find("JsonString",["Nil"]),
133 findObject : find("JsonObject", empty ),
134 findArray : find("JsonArray" ,["Nil"]),
135 findWithDefault : lookupWithDefault,
136 remove : remove,
137 toPrettyJSString : toPrettyJSString,
138 toJSString : toPrettyJSString(''),
139 fromJSString : fromJSString,
140 toPrettyString : function(sep) { return function(v) {
141 return JS.castJSStringToString(toPrettyJSString(sep)(v)); }; },
142 toString : function(v) { return JS.castJSStringToString(toPrettyJSString('')(v)); },
143 fromString : function(v) { return fromJSString(JS.castStringToJSString(v)); },
144 toList : toList,
145 fromList : fromList,
146 JsonString : JsonString,
147 JsonNumber : JsonNumber,
148 JsonBool : JsonBool,
149 JsonNull : JsonNull,
150 JsonArray : JsonArray,
151 JsonObject : JsonObject
152 };
153}();