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