on c19ccfe help sign in
99 lines 3.7 kB history raw
2Elm.Native.Show = function(elm) {
3 'use strict';
5 elm.Native = elm.Native || {};
6 if (elm.Native.Show) return elm.Native.Show;
8 var NList = Elm.Native.List(elm);
9 var List = Elm.List(elm);
10 var Maybe = Elm.Maybe(elm);
11 var JS = Elm.JavaScript(elm);
12 var Dict = Elm.Dict(elm);
13 var Json = Elm.Json(elm);
14 var Tuple2 = Elm.Native.Utils(elm).Tuple2;
16 var toString = function(v) {
17 if (typeof v === "function") {
18 var name = v.func ? v.func.name : v.name;
19 return '<function' + (name === '' ? '' : ': ') + name + '>';
20 } else if (typeof v === "boolean") {
21 return v ? "True" : "False";
22 } else if (typeof v === "number") {
23 return v+"";
24 } else if (typeof v === "string" && v.length < 2) {
25 return "'" + showChar(v) + "'";
26 } else if (typeof v === "object" && '_' in v) {
27 var output = [];
28 for (var k in v._) {
29 for (var i = v._[k].length; i--; ) {
30 output.push(k + " = " + toString(v._[k][i]));
31 }
32 }
33 for (var k in v) {
34 if (k === '_') continue;
35 output.push(k + " = " + toString(v[k]));
36 }
37 if (output.length === 0) return "{}";
38 return "{ " + output.join(", ") + " }";
39 } else if (typeof v === "object" && 'ctor' in v) {
40 if (v.ctor.substring(0,6) === "_Tuple") {
41 var output = [];
42 for (var k in v) {
43 if (k === 'ctor') continue;
44 output.push(toString(v[k]));
45 }
46 return "(" + output.join(",") + ")";
47 } else if (v.ctor === "::") {
48 var isStr = typeof v._0 === "string",
49 start = isStr ? '"' : "[",
50 end = isStr ? '"' : "]",
51 sep = isStr ? "" : ",",
52 f = !isStr ? toString : showChar;
53 var output = start + f(v._0);
54 v = v._1;
55 while (v.ctor === "::") {
56 output += sep + f(v._0);
57 v = v._1;
58 }
59 return output + end;
60 } else if (v.ctor === "[]") {
61 return "[]";
62 } else if (v.ctor === "RBNode" || v.ctor === "RBEmpty") {
63 var cons = F3(function(k,v,acc){return NList.Cons(Tuple2(k,v),acc)});
64 var list = A3(Dict.foldr, cons, NList.Nil, v);
65 var name = "Dict";
66 if (list.ctor === "::" && list._0._1.ctor === "_Tuple0") {
67 name = "Set";
68 list = A2(List.map, function(x){return x._0}, list);
69 }
70 return name + ".fromList " + toString(list);
71 } else {
72 var output = "";
73 for (var i in v) {
74 if (i === 'ctor') continue;
75 var str = toString(v[i]);
76 var parenless = str[0] === '{' || str.indexOf(' ') < 0;
77 output += ' ' + (parenless ? str : '(' + str + ')');
78 }
79 return v.ctor + output;
80 }
81 }
82 return v+"";
83 };
84 function show(v) { return NList.fromArray(toString(v)); }
86 function showChar (c) {
87 return c === '\n' ? '\\n' :
88 c === '\t' ? '\\t' :
89 c === '\b' ? '\\b' :
90 c === '\r' ? '\\r' :
91 c === '\v' ? '\\v' :
92 c === '\0' ? '\\0' :
93 c === '\'' ? "\\'" :
94 c === '\"' ? '\\"' :
95 c === '\\' ? '\\\\' : c;
96 }
98 return elm.Native.Show = { show:show };
99};