on 577fc17 help sign in
85 lines 2.5 kB history raw
1Elm.Native.Json = {};
2Elm.Native.Json.make = function(elm) {
4 elm.Native = elm.Native || {};
5 elm.Native.Json = elm.Native.Json || {};
6 if (elm.Native.Json.values) return elm.Native.Json.values;
8 var Maybe = Elm.Maybe.make(elm);
9 var Dict = Elm.Dict.make(elm);
10 var List = Elm.Native.List.make(elm);
11 var Utils = Elm.Native.Utils.make(elm);
13 function toJS(v) {
14 switch (v.ctor) {
15 case 'Null' : return null;
16 case 'String' : return v._0;
17 case 'Number' : return v._0;
18 case 'Boolean': return v._0;
19 case 'Object' :
20 var obj = {};
21 var array = List.toArray(Dict.toList(v._0));
22 for (var i = array.length; i--; ) {
23 var entry = array[i];
24 obj[entry._0] = toJS(entry._1);
25 }
26 return obj;
27 case 'Array' :
28 var array = List.toArray(v._0);
29 for (var i = array.length; i--; ) {
30 array[i] = toJS(array[i]);
31 }
32 return array;
33 }
34 }
36 function toString(sep, value) {
37 return JSON.stringify(toJS(value), null, sep);
38 }
40 function fromJS(v) {
41 switch (typeof v) {
42 case 'string' : return { ctor:"String" , _0: v };
43 case 'number' : return { ctor:"Number" , _0: v };
44 case 'boolean': return { ctor:"Boolean", _0: v };
45 case 'object' :
46 if (v === null) return { ctor:"Null" };
47 if (v instanceof Array) {
48 var array = new Array(v.length);
49 for (var i = v.length; i--; ) {
50 array[i] = fromJS(v[i]);
51 }
52 return {
53 ctor:"Array",
54 _0: List.fromArray(array)
55 };
56 }
57 var array = [];
58 for (var key in v) {
59 var value = fromJS(v[key]);
60 array.push(Utils.Tuple2(key, value));
61 }
62 var list = List.fromArray(array);
63 return {
64 ctor:"Object",
65 _0: Dict.fromList(list)
66 };
67 }
68 }
70 function fromString(str) {
71 try {
72 return Maybe.Just(fromJS(JSON.parse(str)));
73 } catch (e) {
74 return Maybe.Nothing;
75 }
76 }
78 return elm.Native.Json.values = {
79 toString : F2(toString),
80 fromString : fromString,
81 fromJS : fromJS,
82 toJS : toJS
83 };
85};