on 89bbbb9 help sign in
132 lines 4.6 kB history raw
1Elm.Native.Show = {};
2Elm.Native.Show.make = function(elm) {
3 elm.Native = elm.Native || {};
4 elm.Native.Show = elm.Native.Show || {};
5 if (elm.Native.Show.values) return elm.Native.Show.values;
7 var NList = Elm.Native.List.make(elm);
8 var Array = Elm.Array.make(elm);
9 var List = Elm.List.make(elm);
10 var Dict = Elm.Dict.make(elm);
11 var Tuple2 = Elm.Native.Utils.make(elm).Tuple2;
13 var toString = function(v) {
14 var type = typeof v;
15 if (type === "function") {
16 var name = v.func ? v.func.name : v.name;
17 return '<function' + (name === '' ? '' : ': ') + name + '>';
18 }
19 else if (type === "boolean") {
20 return v ? "True" : "False";
21 }
22 else if (type === "number") {
23 return v + "";
24 }
25 else if ((v instanceof String) && v.isChar) {
26 return "'" + addSlashes(v) + "'";
27 }
28 else if (type === "string") {
29 return '"' + addSlashes(v) + '"';
30 }
31 else if (type === "object" && '_' in v && probablyPublic(v)) {
32 var output = [];
33 for (var k in v._) {
34 for (var i = v._[k].length; i--; ) {
35 output.push(k + " = " + toString(v._[k][i]));
36 }
37 }
38 for (var k in v) {
39 if (k === '_') continue;
40 output.push(k + " = " + toString(v[k]));
41 }
42 if (output.length === 0) {
43 return "{}";
44 }
45 return "{ " + output.join(", ") + " }";
46 }
47 else if (type === "object" && 'ctor' in v) {
48 if (v.ctor.substring(0,6) === "_Tuple") {
49 var output = [];
50 for (var k in v) {
51 if (k === 'ctor') continue;
52 output.push(toString(v[k]));
53 }
54 return "(" + output.join(",") + ")";
55 }
56 else if (v.ctor === "_Array") {
57 var list = Array.toList(v);
58 return "Array.fromList " + toString(list);
59 }
60 else if (v.ctor === "::") {
61 var output = '[' + toString(v._0);
62 v = v._1;
63 while (v.ctor === "::") {
64 output += "," + toString(v._0);
65 v = v._1;
66 }
67 return output + ']';
68 }
69 else if (v.ctor === "[]") {
70 return "[]";
71 }
72 else if (v.ctor === "RBNode" || v.ctor === "RBEmpty") {
73 var cons = F3(function(k,v,acc){return NList.Cons(Tuple2(k,v),acc)});
74 var list = A3(Dict.foldr, cons, NList.Nil, v);
75 var name = "Dict";
76 if (list.ctor === "::" && list._0._1.ctor === "_Tuple0") {
77 name = "Set";
78 list = A2(List.map, function(x){return x._0}, list);
79 }
80 return name + ".fromList " + toString(list);
81 }
82 else {
83 var output = "";
84 for (var i in v) {
85 if (i === 'ctor') continue;
86 var str = toString(v[i]);
87 var parenless = str[0] === '{' || str[0] === '<' || str.indexOf(' ') < 0;
88 output += ' ' + (parenless ? str : '(' + str + ')');
89 }
90 return v.ctor + output;
91 }
92 }
93 if (type === 'object' && 'recv' in v) {
94 return '<signal>';
95 }
96 return "<internal structure>";
97 };
99 function addSlashes(str) {
100 return str.replace(/\\/g, '\\\\')
101 .replace(/\n/g, '\\n')
102 .replace(/\t/g, '\\t')
103 .replace(/\r/g, '\\r')
104 .replace(/\v/g, '\\v')
105 .replace(/\0/g, '\\0')
106 .replace(/\'/g, "\\'")
107 .replace(/\"/g, '\\"');
108 }
110 function probablyPublic(v) {
111 var keys = Object.keys(v);
112 var len = keys.length;
113 if (len === 3
114 && 'props' in v
115 && 'element' in v) return false;
116 if (len === 5
117 && 'horizontal' in v
118 && 'vertical' in v
119 && 'x' in v
120 && 'y' in v) return false;
121 if (len === 7
122 && 'theta' in v
123 && 'scale' in v
124 && 'x' in v
125 && 'y' in v
126 && 'alpha' in v
127 && 'form' in v) return false;
128 return true;
129 }
131 return elm.Native.Show.values = { show:toString };
132};