on af54dd3 help sign in
elk/libraries/Native/JavaScript.js
104 lines 2.9 kB history raw
1Elm.Native.JavaScript = {};
2Elm.Native.JavaScript.make = function(elm) {
3 elm.Native = elm.Native || {};
4 elm.Native.JavaScript = elm.Native.JavaScript || {};
5 if (elm.Native.JavaScript.values) return elm.Native.JavaScript.values;
7 var List = Elm.Native.List.make(elm);
8 var Render = ElmRuntime.use(ElmRuntime.Render.Element);
10 function fromJS(v) {
11 var type = typeof v;
12 if (type === 'number' ) return v;
13 if (type === 'boolean') return v;
14 if (type === 'string' ) return List.fromArray(v);
15 if (v instanceof Array) {
16 var arr = [];
17 var len = v.length;
18 for (var i = 0; i < len; ++i) {
19 var x = fromJS(v[i]);
20 if (x !== null) arr.push(x);
21 }
22 return List.fromArray(arr);
23 }
24 if (type === 'object') {
25 var rec = { _:{} };
26 for (var f in v) {
27 var x = fromJS(v[f]);
28 if (x !== null) rec[f] = x;
29 }
30 return rec;
31 }
32 return null;
33 }
35 function toJS(v) {
36 var type = typeof v;
37 if (type === 'number' || type === 'boolean') return v;
38 if (type === 'object' && '_' in v) {
39 var obj = {};
40 for (var k in v) {
41 var x = toJS(v[k]);
42 if (x !== null) obj[k] = x;
43 }
44 return obj;
45 }
46 if (type === 'object' && (v.ctor === '::' || v.ctor === '[]')) {
47 var array = List.toArray(v);
48 if (typeof array[0] === 'string') {
49 array = array.join('');
50 } else {
51 for (var i = array.length; i--; ) {
52 array[i] = toJS(array[i]);
53 }
54 }
55 return array;
56 }
57 return null;
58 }
60 function fromRecord(r) {
61 if (typeof r === 'object' && '_' in r) {
62 return toJS(r);
63 }
64 throw new Error("'fromRecord' must be called on a record.");
65 }
67 function id(n) { return n; }
69 function toElement(w,h,domNode) {
70 return A3( newElement, w, h, {
71 ctor: 'Custom',
72 type: 'DomNode',
73 render: function(node) { return node; },
74 update: function(node,oldNode,newNode) {
75 if (node === newNode) return;
76 node.parentNode.replaceChild(newNode, node);
77 },
78 model: domNode
79 });
80 }
82 function fromElement(element) {
83 return Render.render(element);
84 }
86 return elm.Native.JavaScript.values = {
87 toInt : function(n) { return n|0; },
88 toFloat : function(n) { return +n; },
89 toBool : id,
90 toString : id,
91 toList : List.fromArray,
92 fromString : id,
93 fromList : List.toArray,
94 fromInt : id,
95 fromFloat : id,
96 fromBool : id,
98 toElement : toElement,
99 fromElement : fromElement,
100 toRecord : fromJS,
101 fromRecord : fromRecord
102 };
104};