elm/libraries/Native/JavaScript.js

81 lines
1.9 KiB
JavaScript
Raw Normal View History

Elm.Native.JavaScript = function(elm) {
'use strict';
elm.Native = elm.Native || {};
if (elm.Native.JavaScript) return elm.Native.JavaScript;
var List = Elm.Native.List(elm);
function fromJS(v) {
var type = typeof v;
if (type === 'number' ) return v;
if (type === 'boolean') return v;
if (type === 'string' ) return List.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 List.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 = List.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.");
}
2013-03-10 08:54:37 +00:00
function id(n) { return n }
return elm.Native.JavaScript = {
2013-03-10 08:54:37 +00:00
toFloat : id,
toBool : id,
toInt : function(n) { return n|0 },
toString : function(s) { return List.fromArray(s) },
toList : List.fromArray,
fromString : function(s) { return List.toArray(s).join('') },
fromList : List.toArray,
2013-03-10 08:54:37 +00:00
fromInt : id,
fromFloat : id,
fromBool : id,
toRecord : fromJS,
fromRecord : fromRecord
};
};