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