2013-03-03 05:43:44 +00:00
|
|
|
|
2013-03-09 07:22:15 +00:00
|
|
|
Elm.Native.JavaScript = function(elm) {
|
2013-03-03 05:43:44 +00:00
|
|
|
'use strict';
|
|
|
|
|
2013-03-09 07:22:15 +00:00
|
|
|
elm.Native = elm.Native || {};
|
|
|
|
if (elm.Native.JavaScript) return elm.Native.JavaScript;
|
|
|
|
|
|
|
|
var List = Elm.Native.List(elm);
|
2013-05-17 20:46:08 +00:00
|
|
|
var Render = ElmRuntime.use(ElmRuntime.Render.Element);
|
2013-03-03 05:43:44 +00:00
|
|
|
|
|
|
|
function fromJS(v) {
|
2013-06-09 20:55:38 +00:00
|
|
|
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);
|
2013-03-03 05:43:44 +00:00
|
|
|
}
|
2013-06-09 20:55:38 +00:00
|
|
|
if (type === 'object') {
|
|
|
|
var rec = { _:{} };
|
|
|
|
for (var f in v) {
|
|
|
|
var x = fromJS(v[f]);
|
|
|
|
if (x !== null) rec[f] = x;
|
|
|
|
}
|
|
|
|
return rec;
|
2013-03-03 05:43:44 +00:00
|
|
|
}
|
2013-06-09 20:55:38 +00:00
|
|
|
return null;
|
2013-03-03 05:43:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function toJS(v) {
|
2013-06-09 20:55:38 +00:00
|
|
|
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 = toJS(v[k]);
|
|
|
|
if (x !== null) obj[k] = x;
|
|
|
|
}
|
|
|
|
return obj;
|
|
|
|
}
|
2013-06-21 04:25:10 +00:00
|
|
|
if (type === 'object' && (v.ctor === '::' || v.ctor === '[]')) {
|
2013-06-09 20:55:38 +00:00
|
|
|
var array = List.toArray(v);
|
|
|
|
if (typeof array[0] === 'string') {
|
|
|
|
array = array.join('');
|
|
|
|
} else {
|
|
|
|
for (var i = array.length; i--; ) {
|
|
|
|
array[i] = toJS(array[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return array;
|
|
|
|
}
|
|
|
|
return null;
|
2013-03-03 05:43:44 +00:00
|
|
|
}
|
2013-06-09 20:55:38 +00:00
|
|
|
|
2013-03-03 05:43:44 +00:00
|
|
|
function fromRecord(r) {
|
2013-06-09 20:55:38 +00:00
|
|
|
if (typeof r === 'object' && '_' in r) {
|
|
|
|
return toJS(r);
|
|
|
|
}
|
|
|
|
throw new Error("'fromRecord' must be called on a record.");
|
2013-03-03 05:43:44 +00:00
|
|
|
}
|
|
|
|
|
2013-05-17 20:46:08 +00:00
|
|
|
function id(n) { return n; }
|
|
|
|
|
|
|
|
function toElement(w,h,domNode) {
|
|
|
|
return A3( newElement, w, h, {
|
|
|
|
ctor: 'Custom',
|
|
|
|
type: 'DomNode',
|
|
|
|
render: function(node) { return node; },
|
|
|
|
update: function(node,oldNode,newNode) {
|
|
|
|
if (node === newNode) return;
|
|
|
|
node.parentNode.replaceChild(newNode, node);
|
|
|
|
},
|
|
|
|
model: domNode
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function fromElement(element) {
|
|
|
|
return Render.render(element);
|
|
|
|
}
|
2013-03-10 08:54:37 +00:00
|
|
|
|
2013-03-09 07:22:15 +00:00
|
|
|
return elm.Native.JavaScript = {
|
2013-03-10 08:54:37 +00:00
|
|
|
toFloat : id,
|
|
|
|
toBool : id,
|
2013-05-20 13:36:21 +00:00
|
|
|
toInt : function(n) { return n|0; },
|
|
|
|
toString : List.fromArray,
|
2013-03-09 07:22:15 +00:00
|
|
|
toList : List.fromArray,
|
2013-05-20 13:36:21 +00:00
|
|
|
fromString : function(s) { return List.toArray(s).join(''); },
|
2013-03-09 07:22:15 +00:00
|
|
|
fromList : List.toArray,
|
2013-03-10 08:54:37 +00:00
|
|
|
fromInt : id,
|
|
|
|
fromFloat : id,
|
|
|
|
fromBool : id,
|
2013-05-17 20:46:08 +00:00
|
|
|
|
|
|
|
toElement : toElement,
|
|
|
|
fromElement : fromElement,
|
|
|
|
toRecord : fromJS,
|
|
|
|
fromRecord : fromRecord
|
2013-03-03 05:43:44 +00:00
|
|
|
};
|
|
|
|
|
2013-06-09 20:55:38 +00:00
|
|
|
};
|