on 29a2ec3 help sign in
elk/libraries/Native/Utils.js
104 lines 2.8 kB history raw
2Elm.Native.Utils = function(elm) {
3 'use strict';
5 function eq(x,y) {
6 if (x === y) return true;
7 if (typeof x === "object") {
8 var c = 0;
9 for (var i in x) { ++c; if (!eq(x[i],y[i])) return false; }
10 return c === Object.keys(y).length;
11 }
12 if (typeof x === 'function') {
13 throw new Error('Equality error: general function equality is ' +
14 'undecidable, and therefore, unsupported');
15 }
16 return x === y;
17 }
19 var EQ = 0, LT = 1, GT = 2, ord = ['EQ','LT','GT'];
20 function compare(x,y) { return { ctor: ord[cmp(x,y)] } }
21 function cmp(x,y) {
22 if (typeof x !== 'object') return x === y ? EQ : x < y ? LT : GT;
24 if (x.ctor === "Cons" || x.ctor === "Nil") {
25 while (true) {
26 if (x.ctor === "Nil" && y.ctor === "Nil") return EQ;
27 if (x.ctor !== y.ctor) return {ctor: x.ctor==='Nil'?LT:GT};
28 var ord = cmp(x._0, y._0);
29 if (ord !== EQ) return ord;
30 x = x._1;
31 y = y._1;
32 }
33 }
34 if (x.ctor.slice(0,5) === 'Tuple') {
35 var n = x.ctor.slice(5) - 0;
36 var err = 'cannot compare tuples with more than 6 elements.';
37 if (n === 0) return EQ;
38 if (n >= 1) { ord = cmp(x._0, y._0); if (ord !== EQ) return ord;
39 if (n >= 2) { ord = cmp(x._1, y._1); if (ord !== EQ) return ord;
40 if (n >= 3) { ord = cmp(x._2, y._2); if (ord !== EQ) return ord;
41 if (n >= 4) { ord = cmp(x._3, y._3); if (ord !== EQ) return ord;
42 if (n >= 5) { ord = cmp(x._4, y._4); if (ord !== EQ) return ord;
43 if (n >= 6) { ord = cmp(x._5, y._5); if (ord !== EQ) return ord;
44 if (n >= 7) throw new Error('Comparison error: ' + err); } } } } } }
45 return EQ;
46 }
47 throw new Error('Comparison error: comparison is only defined on ints, ' +
48 'floats, times, chars, strings, lists of comparable values, ' +
49 'and tuples of comparable values.')
50 }
53 var Tuple0 = { ctor: "Tuple0" }
54 function Tuple2(x,y) { return { ctor = "Tuple2", _0:x, _1:y } }
56 var count = 0;
57 function guid(_) { return count++ }
59 function copy(r) {
60 var o = {};
61 for (var i in r) { o[i] = r[i]; }
62 return o;
63 }
65 function remove(x,r) {
66 var o = copy(r);
67 if (x in o._) {
68 o[x] = o._[x][0];
69 o._[x] = o._[x].slice(1);
70 if (o._[x].length === 0) { delete o._[x]; }
71 } else {
72 delete o[x];
73 }
74 return o;
75 }
77 function replace(kvs,r) {
78 var o = copy(r);
79 for (var i = kvs.length; i--; ) {
80 kvsi = kvs[i];
81 o[kvsi[0]] = kvsi[1];
82 }
83 return o;
84 }
86 function insert(x,v,r) {
87 var o = copy(r);
88 if (x in o) o._[x] = [o[x]].concat(x in o._ ? o._[x].slice(0) : []);
89 o[x] = v;
90 return o;
91 }
93 return elm.Native.Utils = {
94 eq:eq,
95 compare:compare,
96 Tuple0:Tuple0,
97 Tuple2:Tuple2,
98 copy: copy,
99 remove: remove,
100 replace: replace,
101 insert: insert,
102 guid: guid
103 };
104};