on f589cf3 help sign in
elk/libraries/Native/JavaScript.js
76 lines 1.8 kB history raw
1/**
2module Native.JavaScript where
3**/
5(function() {
6 'use strict';
8 var fromArray = Elm.Native.List.fromArray;
9 var toArray = Elm.Native.List.toArray;
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 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 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 = v[k];
43 if (x !== null) obj[k] = x;
44 }
45 return obj;
46 }
47 if (type === 'object' && (v.ctor === 'Cons' || v.ctor === 'Nil')) {
48 var array = toArray(v);
49 for (var i = array.length; i--; ) {
50 array[i] = toJS(array[i]);
51 }
52 if (typeof array[0] === 'string') array.join('');
53 return array;
54 }
55 return null;
56 }
58 function fromRecord(r) {
59 if (typeof r === 'object' && '_' in r) {
60 return toJS(r);
61 }
62 throw new Error("'fromRecord' must be called on a record.");
63 }
65 Elm.Native.JavaScript = {
66 id : function(n) { return n },
67 toInt : function(n) { return n|0 },
68 toString : function(s) { return fromArray(s) },
69 toList : fromArray,
70 fromString : function(s) { return toArray(s).join('') },
71 fromList : toArray,
72 toRecord : fromJS,
73 fromRecord : fromRecord
74 };
76}());