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