2013-09-30 07:44:31 +00:00
|
|
|
Elm.Native.Show = {};
|
|
|
|
Elm.Native.Show.make = function(elm) {
|
2013-04-07 15:40:27 +00:00
|
|
|
elm.Native = elm.Native || {};
|
2013-09-30 08:32:27 +00:00
|
|
|
elm.Native.Show = elm.Native.Show || {};
|
|
|
|
if (elm.Native.Show.values) return elm.Native.Show.values;
|
2013-03-11 17:46:16 +00:00
|
|
|
|
2013-09-30 07:44:31 +00:00
|
|
|
var NList = Elm.Native.List.make(elm);
|
|
|
|
var List = Elm.List.make(elm);
|
|
|
|
var Maybe = Elm.Maybe.make(elm);
|
|
|
|
var JS = Elm.JavaScript.make(elm);
|
|
|
|
var Dict = Elm.Dict.make(elm);
|
|
|
|
var Json = Elm.Json.make(elm);
|
|
|
|
var Tuple2 = Elm.Native.Utils.make(elm).Tuple2;
|
2013-03-11 17:46:16 +00:00
|
|
|
|
2013-04-07 15:40:27 +00:00
|
|
|
var toString = function(v) {
|
2013-09-01 23:40:27 +00:00
|
|
|
var type = typeof v;
|
|
|
|
if (type === "function") {
|
2013-05-06 00:48:50 +00:00
|
|
|
var name = v.func ? v.func.name : v.name;
|
|
|
|
return '<function' + (name === '' ? '' : ': ') + name + '>';
|
2013-09-01 23:40:27 +00:00
|
|
|
} else if (type === "boolean") {
|
2013-04-07 15:40:27 +00:00
|
|
|
return v ? "True" : "False";
|
2013-09-01 23:40:27 +00:00
|
|
|
} else if (type === "number") {
|
2013-04-07 15:40:27 +00:00
|
|
|
return v+"";
|
2013-10-24 13:02:29 +00:00
|
|
|
} else if ((v instanceof String) && v.isChar) {
|
2013-10-10 19:16:47 +00:00
|
|
|
return "'" + addSlashes(v) + "'";
|
2013-10-04 18:40:46 +00:00
|
|
|
} else if (type === "string") {
|
2013-10-10 19:16:47 +00:00
|
|
|
return '"' + addSlashes(v) + '"';
|
2013-09-01 23:40:27 +00:00
|
|
|
} else if (type === "object" && '_' in v) {
|
2013-04-07 15:40:27 +00:00
|
|
|
var output = [];
|
|
|
|
for (var k in v._) {
|
|
|
|
for (var i = v._[k].length; i--; ) {
|
|
|
|
output.push(k + " = " + toString(v._[k][i]));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for (var k in v) {
|
|
|
|
if (k === '_') continue;
|
|
|
|
output.push(k + " = " + toString(v[k]));
|
|
|
|
}
|
|
|
|
if (output.length === 0) return "{}";
|
|
|
|
return "{ " + output.join(", ") + " }";
|
2013-09-01 23:40:27 +00:00
|
|
|
} else if (type === "object" && 'ctor' in v) {
|
2013-07-14 23:05:14 +00:00
|
|
|
if (v.ctor.substring(0,6) === "_Tuple") {
|
2013-04-07 15:40:27 +00:00
|
|
|
var output = [];
|
|
|
|
for (var k in v) {
|
|
|
|
if (k === 'ctor') continue;
|
|
|
|
output.push(toString(v[k]));
|
|
|
|
}
|
|
|
|
return "(" + output.join(",") + ")";
|
2013-06-21 04:25:10 +00:00
|
|
|
} else if (v.ctor === "::") {
|
2013-10-04 18:40:46 +00:00
|
|
|
var output = '[' + toString(v._0);
|
2013-04-07 15:40:27 +00:00
|
|
|
v = v._1;
|
2013-06-21 04:25:10 +00:00
|
|
|
while (v.ctor === "::") {
|
2013-10-04 18:40:46 +00:00
|
|
|
output += "," + toString(v._0);
|
2013-04-07 15:40:27 +00:00
|
|
|
v = v._1;
|
|
|
|
}
|
2013-10-04 18:40:46 +00:00
|
|
|
return output + ']';
|
2013-06-21 04:25:10 +00:00
|
|
|
} else if (v.ctor === "[]") {
|
2013-04-07 15:40:27 +00:00
|
|
|
return "[]";
|
|
|
|
} else if (v.ctor === "RBNode" || v.ctor === "RBEmpty") {
|
|
|
|
var cons = F3(function(k,v,acc){return NList.Cons(Tuple2(k,v),acc)});
|
|
|
|
var list = A3(Dict.foldr, cons, NList.Nil, v);
|
|
|
|
var name = "Dict";
|
2013-07-14 23:05:14 +00:00
|
|
|
if (list.ctor === "::" && list._0._1.ctor === "_Tuple0") {
|
2013-04-07 15:40:27 +00:00
|
|
|
name = "Set";
|
|
|
|
list = A2(List.map, function(x){return x._0}, list);
|
|
|
|
}
|
|
|
|
return name + ".fromList " + toString(list);
|
|
|
|
} else {
|
|
|
|
var output = "";
|
|
|
|
for (var i in v) {
|
|
|
|
if (i === 'ctor') continue;
|
|
|
|
var str = toString(v[i]);
|
2013-07-30 16:10:06 +00:00
|
|
|
var parenless = str[0] === '{' || str[0] === '<' || str.indexOf(' ') < 0;
|
2013-04-07 15:40:27 +00:00
|
|
|
output += ' ' + (parenless ? str : '(' + str + ')');
|
|
|
|
}
|
|
|
|
return v.ctor + output;
|
|
|
|
}
|
|
|
|
}
|
2013-09-01 23:40:27 +00:00
|
|
|
if (type === 'object' && 'recv' in v) return '<signal>';
|
2013-07-30 16:10:06 +00:00
|
|
|
return "<internal structure>";
|
2013-04-07 15:40:27 +00:00
|
|
|
};
|
2013-03-11 17:46:16 +00:00
|
|
|
|
2013-10-04 18:40:46 +00:00
|
|
|
function addSlashes(str) {
|
2013-10-04 18:52:16 +00:00
|
|
|
return str.replace(/\\/g, '\\\\')
|
|
|
|
.replace(/\n/g, '\\n')
|
2013-10-04 18:40:46 +00:00
|
|
|
.replace(/\t/g, '\\t')
|
|
|
|
.replace(/\r/g, '\\r')
|
|
|
|
.replace(/\v/g, '\\v')
|
|
|
|
.replace(/\0/g, '\\0')
|
|
|
|
.replace(/\'/g, "\\'")
|
2013-10-04 18:52:16 +00:00
|
|
|
.replace(/\"/g, '\\"');
|
2013-05-06 00:48:50 +00:00
|
|
|
}
|
|
|
|
|
2013-10-03 00:37:07 +00:00
|
|
|
return elm.Native.Show.values = { show:toString };
|
2013-05-11 20:42:45 +00:00
|
|
|
};
|