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