on master help sign in
Add JSON library.
commitb6806c5d4830c5438736b035d1767439f0031441 authorevancz <info@elm-lang.org> dateSat 28 Jul 2012, 20:33 (14 years ago) parent39f00d8
1 file changed+138
core-js/foreign/JSON.js+138
core-js/foreign/JSON.jsnew file+138
@@ -0,0 +1,138 @@
1+
2+var 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+ }
43+
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 ]; }
50+
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+ }
67+
68+ function toPrettyJSString(sep) { return function (obj) {
69+ function fromValue(v) {
70+ switch (v[0]) {
71+ case 'JSNull' : return null;
72+ case 'JSString' : return JS.castStringToJSString(v[1]);
73+ case 'JSObject' :
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 'JSArray' :
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([ 'JSObject', 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 [ "JSString", JS.castJSStringToString(v) ];
98+ case 'number' : return [ "JSNumber", JS.castJSNumberToFloat(v) ];
99+ case 'boolean' : return [ "JSBool", JS.castJSBoolToBool(v) ];
100+ case 'object' :
101+ if (v === null) return [ "JSNull" ];
102+ for (var i in v) {
103+ v[i] = toValue(v[i]);
104+ }
105+ if (v instanceof Array) return [ "JSArray", JS.castJSArrayToList(v) ];
106+ return [ "JSObject", [ "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+ lookupWithDefault : 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+ JSString : JSString,
130+ JSNumber : JSNumber,
131+ JSBool : JSBool,
132+ JSNull : JSNull,
133+ JSArray : JSArray,
134+ JSObject : JSObject
135+ };
136+}();
137+
138+Foreign.JavaScript.JSON = ElmJSON;