on 73ec76f help sign in
Idris-dev/js/Runtime.js
399 lines 12 kB history raw
1var __IDRRT__ = {};
3/** @constructor */
4__IDRRT__.Type = function(type) {
5 this.type = type;
6};
8__IDRRT__.Int = new __IDRRT__.Type('Int');
9__IDRRT__.Char = new __IDRRT__.Type('Char');
10__IDRRT__.String = new __IDRRT__.Type('String');
11__IDRRT__.Integer = new __IDRRT__.Type('Integer');
12__IDRRT__.Float = new __IDRRT__.Type('Float');
13__IDRRT__.Forgot = new __IDRRT__.Type('Forgot');
15/** @constructor */
16__IDRRT__.Tailcall = function(f) { this.f = f };
18/** @constructor */
19__IDRRT__.Con = function(i,vars) {
20 this.i = i;
21 this.vars = vars;
22};
24__IDRRT__.tailcall = function(f) {
25 var __f = f;
26 var ret;
27 while (__f) {
28 f = __f;
29 __f = null;
30 ret = f();
32 if (ret instanceof __IDRRT__.Tailcall) {
33 __f = ret.f;
34 } else {
35 return ret;
36 }
37 }
38};
40__IDRRT__.print = (function(){
41 if (require) {
42 var util = require('util');
43 return function(s) {
44 util.print(s);
45 };
46 } else {
47 return function(s) {
48 console.log(s);
49 };
50 }
51})();
53/*
54 BigInteger Javascript code taken from:
55 https://github.com/peterolson
56*/
57__IDRRT__.bigInt = (function () {
58 var base = 10000000, logBase = 7;
59 var sign = {
60 positive: false,
61 negative: true
62 };
64 var normalize = function (first, second) {
65 var a = first.value, b = second.value;
66 var length = a.length > b.length ? a.length : b.length;
67 for (var i = 0; i < length; i++) {
68 a[i] = a[i] || 0;
69 b[i] = b[i] || 0;
70 }
71 for (var i = length - 1; i >= 0; i--) {
72 if (a[i] === 0 && b[i] === 0) {
73 a.pop();
74 b.pop();
75 } else break;
76 }
77 if (!a.length) a = [0], b = [0];
78 first.value = a;
79 second.value = b;
80 };
82 var parse = function (text, first) {
83 if (typeof text === "object") return text;
84 text += "";
85 var s = sign.positive, value = [];
86 if (text[0] === "-") {
87 s = sign.negative;
88 text = text.slice(1);
89 }
90 var text = text.split("e");
91 if (text.length > 2) throw new Error("Invalid integer");
92 if (text[1]) {
93 var exp = text[1];
94 if (exp[0] === "+") exp = exp.slice(1);
95 exp = parse(exp);
96 if (exp.lesser(0)) throw new Error("Cannot include negative exponent part for integers");
97 while (exp.notEquals(0)) {
98 text[0] += "0";
99 exp = exp.prev();
100 }
101 }
102 text = text[0];
103 if (text === "-0") text = "0";
104 var isValid = /^([0-9][0-9]*)$/.test(text);
105 if (!isValid) throw new Error("Invalid integer");
106 while (text.length) {
107 var divider = text.length > logBase ? text.length - logBase : 0;
108 value.push(+text.slice(divider));
109 text = text.slice(0, divider);
110 }
111 var val = bigInt(value, s);
112 if (first) normalize(first, val);
113 return val;
114 };
116 var goesInto = function (a, b) {
117 var a = bigInt(a, sign.positive), b = bigInt(b, sign.positive);
118 if (a.equals(0)) throw new Error("Cannot divide by 0");
119 var n = 0;
120 do {
121 var inc = 1;
122 var c = bigInt(a.value, sign.positive), t = c.times(10);
123 while (t.lesser(b)) {
124 c = t;
125 inc *= 10;
126 t = t.times(10);
127 }
128 while (c.lesserOrEquals(b)) {
129 b = b.minus(c);
130 n += inc;
131 }
132 } while (a.lesserOrEquals(b));
134 return {
135 remainder: b.value,
136 result: n
137 };
138 };
140 var bigInt = function (value, s) {
141 var self = {
142 value: value,
143 sign: s
144 };
145 var o = {
146 value: value,
147 sign: s,
148 negate: function (m) {
149 var first = m || self;
150 return bigInt(first.value, !first.sign);
151 },
152 abs: function (m) {
153 var first = m || self;
154 return bigInt(first.value, sign.positive);
155 },
156 add: function (n, m) {
157 var s, first = self, second;
158 if (m) (first = parse(n)) && (second = parse(m));
159 else second = parse(n, first);
160 s = first.sign;
161 if (first.sign !== second.sign) {
162 first = bigInt(first.value, sign.positive);
163 second = bigInt(second.value, sign.positive);
164 return s === sign.positive ?
165 o.subtract(first, second) :
166 o.subtract(second, first);
167 }
168 normalize(first, second);
169 var a = first.value, b = second.value;
170 var result = [],
171 carry = 0;
172 for (var i = 0; i < a.length || carry > 0; i++) {
173 var sum = (a[i] || 0) + (b[i] || 0) + carry;
174 carry = sum >= base ? 1 : 0;
175 sum -= carry * base;
176 result.push(sum);
177 }
178 return bigInt(result, s);
179 },
180 plus: function (n, m) {
181 return o.add(n, m);
182 },
183 subtract: function (n, m) {
184 var first = self, second;
185 if (m) (first = parse(n)) && (second = parse(m));
186 else second = parse(n, first);
187 if (first.sign !== second.sign) return o.add(first, o.negate(second));
188 if (first.sign === sign.negative) return o.subtract(o.negate(second), o.negate(first));
189 if (o.compare(first, second) === -1) return o.negate(o.subtract(second, first));
190 var a = first.value, b = second.value;
191 var result = [],
192 borrow = 0;
193 for (var i = 0; i < a.length; i++) {
194 a[i] -= borrow;
195 borrow = a[i] < b[i] ? 1 : 0;
196 var minuend = (borrow * base) + a[i] - b[i];
197 result.push(minuend);
198 }
199 return bigInt(result, sign.positive);
200 },
201 minus: function (n, m) {
202 return o.subtract(n, m);
203 },
204 multiply: function (n, m) {
205 var s, first = self, second;
206 if (m) (first = parse(n)) && (second = parse(m));
207 else second = parse(n, first);
208 s = first.sign !== second.sign;
209 var a = first.value, b = second.value;
210 var resultSum = [];
211 for (var i = 0; i < a.length; i++) {
212 resultSum[i] = [];
213 var j = i;
214 while (j--) {
215 resultSum[i].push(0);
216 }
217 }
218 var carry = 0;
219 for (var i = 0; i < a.length; i++) {
220 var x = a[i];
221 for (var j = 0; j < b.length || carry > 0; j++) {
222 var y = b[j];
223 var product = y ? (x * y) + carry : carry;
224 carry = product > base ? Math.floor(product / base) : 0;
225 product -= carry * base;
226 resultSum[i].push(product);
227 }
228 }
229 var max = -1;
230 for (var i = 0; i < resultSum.length; i++) {
231 var len = resultSum[i].length;
232 if (len > max) max = len;
233 }
234 var result = [], carry = 0;
235 for (var i = 0; i < max || carry > 0; i++) {
236 var sum = carry;
237 for (var j = 0; j < resultSum.length; j++) {
238 sum += resultSum[j][i] || 0;
239 }
240 carry = sum > base ? Math.floor(sum / base) : 0;
241 sum -= carry * base;
242 result.push(sum);
243 }
244 return bigInt(result, s);
245 },
246 times: function (n, m) {
247 return o.multiply(n, m);
248 },
249 divmod: function (n, m) {
250 var s, first = self, second;
251 if (m) (first = parse(n)) && (second = parse(m));
252 else second = parse(n, first);
253 s = first.sign !== second.sign;
254 if (bigInt(first.value, first.sign).equals(0)) return {
255 quotient: bigInt([0], sign.positive),
256 remainder: bigInt([0], sign.positive)
257 };
258 if (second.equals(0)) throw new Error("Cannot divide by zero");
259 var a = first.value, b = second.value;
260 var result = [], remainder = [];
261 for (var i = a.length - 1; i >= 0; i--) {
262 var n = [a[i]].concat(remainder);
263 var quotient = goesInto(b, n);
264 result.push(quotient.result);
265 remainder = quotient.remainder;
266 }
267 result.reverse();
268 return {
269 quotient: bigInt(result, s),
270 remainder: bigInt(remainder, first.sign)
271 };
272 },
273 divide: function (n, m) {
274 return o.divmod(n, m).quotient;
275 },
276 over: function (n, m) {
277 return o.divide(n, m);
278 },
279 mod: function (n, m) {
280 return o.divmod(n, m).remainder;
281 },
282 pow: function (n, m) {
283 var first = self, second;
284 if (m) (first = parse(n)) && (second = parse(m));
285 else second = parse(n, first);
286 var a = first, b = second;
287 if (b.lesser(0)) return ZERO;
288 if (b.equals(0)) return ONE;
289 var result = bigInt(a.value, a.sign);
291 if (b.mod(2).equals(0)) {
292 var c = result.pow(b.over(2));
293 return c.times(c);
294 } else {
295 return result.times(result.pow(b.minus(1)));
296 }
297 },
298 next: function (m) {
299 var first = m || self;
300 return o.add(first, 1);
301 },
302 prev: function (m) {
303 var first = m || self;
304 return o.subtract(first, 1);
305 },
306 compare: function (n, m) {
307 var first = self, second;
308 if (m) (first = parse(n)) && (second = parse(m, first));
309 else second = parse(n, first);
310 normalize(first, second);
311 if (first.value.length === 1 && second.value.length === 1 && first.value[0] === 0 && second.value[0] === 0) return 0;
312 if (second.sign !== first.sign) return first.sign === sign.positive ? 1 : -1;
313 var multiplier = first.sign === sign.positive ? 1 : -1;
314 var a = first.value, b = second.value;
315 for (var i = a.length - 1; i >= 0; i--) {
316 if (a[i] > b[i]) return 1 * multiplier;
317 if (b[i] > a[i]) return -1 * multiplier;
318 }
319 return 0;
320 },
321 compareAbs: function (n, m) {
322 var first = self, second;
323 if (m) (first = parse(n)) && (second = parse(m, first));
324 else second = parse(n, first);
325 first.sign = second.sign = sign.positive;
326 return o.compare(first, second);
327 },
328 equals: function (n, m) {
329 return o.compare(n, m) === 0;
330 },
331 notEquals: function (n, m) {
332 return !o.equals(n, m);
333 },
334 lesser: function (n, m) {
335 return o.compare(n, m) < 0;
336 },
337 greater: function (n, m) {
338 return o.compare(n, m) > 0;
339 },
340 greaterOrEquals: function (n, m) {
341 return o.compare(n, m) >= 0;
342 },
343 lesserOrEquals: function (n, m) {
344 return o.compare(n, m) <= 0;
345 },
346 isPositive: function (m) {
347 var first = m || self;
348 return first.sign === sign.positive;
349 },
350 isNegative: function (m) {
351 var first = m || self;
352 return first.sign === sign.negative;
353 },
354 isEven: function (m) {
355 var first = m || self;
356 return first.value[0] % 2 === 0;
357 },
358 isOdd: function (m) {
359 var first = m || self;
360 return first.value[0] % 2 === 1;
361 },
362 toString: function (m) {
363 var first = m || self;
364 var str = "", len = first.value.length;
365 while (len--) {
366 str += (base.toString() + first.value[len]).slice(-logBase);
367 }
368 while (str[0] === "0") {
369 str = str.slice(1);
370 }
371 if (!str.length) str = "0";
372 var s = first.sign === sign.positive ? "" : "-";
373 return s + str;
374 },
375 toJSNumber: function (m) {
376 return +o.toString(m);
377 },
378 valueOf: function (m) {
379 return o.toJSNumber(m);
380 }
381 };
382 return o;
383 };
385 var ZERO = bigInt([0], sign.positive);
386 var ONE = bigInt([1], sign.positive);
387 var MINUS_ONE = bigInt([1], sign.negative);
389 var fnReturn = function (a) {
390 if (typeof a === "undefined") return ZERO;
391 return parse(a);
392 };
393 fnReturn.zero = ZERO;
394 fnReturn.one = ONE;
395 fnReturn.minusOne = MINUS_ONE;
396 return fnReturn;
397})();
399var __IDR__ = {};