elm/core/Native/JavaScript.js

76 lines
No EOL
1.7 KiB
JavaScript

/**
module Native.JavaScript where
**/
(function() {
'use strict';
var fromArray = Elm.Native.List.fromArray;
var toArray = Elm.Native.List.toArray;
function fromJS(v) {
var type = typeof v;
if (type === 'number' ) return v;
if (type === 'boolean') return v;
if (type === 'string' ) return fromArray(v);
if (v instanceof Array) {
var arr = [];
var len = v.length;
for (var i = 0; i < len; ++i) {
var x = fromJS(v[i]);
if (x !== null) arr.push(x);
}
return fromArray(arr);
}
if (type === 'object') {
var rec = { _:{} };
for (var f in v) {
var x = fromJS(v[f]);
if (x !== null) rec[f] = x;
}
return rec;
}
return null;
}
function toJS(v) {
var type = typeof v;
if (type === 'number' || type === 'boolean') return v;
if (type === 'object' && '_' in v) {
var obj = {};
for (var k in v) {
var x = v[k];
if (x !== null) obj[k] = x;
}
return obj;
}
if (type === 'object' && (v.ctor === 'Cons' || v.ctor === 'Nil')) {
var array = toArray(v);
for (var i = array.length; i--; ) {
array[i] = toJS(array[i]);
}
if (typeof array[0] === 'string') array.join('');
return array;
}
return null;
}
function fromRecord(r) {
if (typeof r === 'object' && '_' in r) {
return toJS(r);
}
throw new Error("'fromRecord' must be called on a record.");
}
Elm.Native.JavaScript = {
id : function(n) { return n },
toInt : function(n) { return n|0 },
toString : function(s) { return fromArray(s) },
toList : fromArray,
fromString : function(s) { return toArray(s).join('') },
fromList : toArray,
toRecord : fromJS,
fromRecord : fromRecord
};
}());