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