@@ -0,0 +1,85 @@
1+
2+/**
3+module Native.Json where
4+
5+import Maybe
6+import JavaScript
7+import Dict
8+import List
9+**/
10+
11+(function() {
12+ 'use strict';
13+
14+ var JS = Elm.JavaScript;
15+
16+ function fromValue(v) {
17+ switch (v.ctor) {
18+ case 'Null' : return null;
19+ case 'String' : return JS.fromString(v._0);
20+ case 'Object' :
21+ var obj = {};
22+ var array = JS.fromList(Elm.Dict.toList(v._0));
23+ for (var i = arr.length; i--; ) {
24+ obj[JS.fromString(array[i]._0)] = fromValue(array[i]._1);
25+ }
26+ return obj;
27+ case 'Array' :
28+ var array = JS.fromList(v._0);
29+ for (var i = array.length; i--; ) {
30+ array[i] = fromValue(array[i]);
31+ }
32+ return array;
33+ default :
34+ return v._0;
35+ }
36+ }
37+
38+ function toPrettyJSString(sep, obj) {
39+ return JSON.stringify(fromValue(obj), null, JS.fromString(sep));
40+ }
41+
42+ function toValue(v) {
43+ switch (typeof v) {
44+ case 'string' : return { ctor:"String", _0: JS.toString(v) };
45+ case 'number' : return { ctor:"Number", _0: JS.toFloat(v) };
46+ case 'boolean': return { ctor:"Bool" , _0: JS.toBool(v) };
47+ case 'object' :
48+ if (v === null) return { ctor:"Null" };
49+ if (v instanceof Array) {
50+ for (var i = v.length; i--; ) { v[i] = toValue(v[i]); }
51+ return { ctor:"Array", _0: JS.toList(v) };
52+ }
53+ var array = [];
54+ for (var k in v) array.push(Tuple2(JS.toString(k), toValue(v[k])));
55+ return { ctor:"Object", _0: Elm.Dict.fromList(JS.toList(array)) };
56+ }
57+ }
58+
59+ function fromJSString(str) {
60+ try {
61+ return Elm.Maybe.Just(toValue(JSON.parse(str)));
62+ } catch (e) {
63+ return Elm.Maybe.Nothing;
64+ }
65+ }
66+
67+ function recordFromJSString(str) {
68+ try {
69+ return Elm.Maybe.Just(JS.toRecord(JSON.parse(str)));
70+ } catch (e) {
71+ return Elm.Maybe.Nothing;
72+ }
73+ }
74+ function recordToPrettyJSString(sep, rec) {
75+ return JSON.stringify(JS.fromRecord(rec), null, JS.fromString(sep));
76+ }
77+
78+ Elm.Native.Json = {
79+ toPrettyJSString : F2(toPrettyJSString),
80+ fromJSString : fromJSString,
81+ recordToPrettyJSString : F2(recordToPrettyJSString),
82+ recordFromJSString : recordFromJSString
83+ };
84+
85+}());