298 lines
5.1 KiB
JavaScript
298 lines
5.1 KiB
JavaScript
'use strict';
|
|
|
|
var Curry = require("./curry.js");
|
|
var Caml_option = require("./caml_option.js");
|
|
|
|
function make(param) {
|
|
return {
|
|
length: 0,
|
|
first: undefined,
|
|
last: undefined
|
|
};
|
|
}
|
|
|
|
function clear(q) {
|
|
q.length = 0;
|
|
q.first = undefined;
|
|
q.last = undefined;
|
|
}
|
|
|
|
function add(q, x) {
|
|
var cell = {
|
|
content: x,
|
|
next: undefined
|
|
};
|
|
var last = q.last;
|
|
if (last !== undefined) {
|
|
q.length = q.length + 1 | 0;
|
|
last.next = cell;
|
|
q.last = cell;
|
|
} else {
|
|
q.length = 1;
|
|
q.first = cell;
|
|
q.last = cell;
|
|
}
|
|
}
|
|
|
|
function peek(q) {
|
|
var v = q.first;
|
|
if (v !== undefined) {
|
|
return Caml_option.some(v.content);
|
|
}
|
|
|
|
}
|
|
|
|
function peekUndefined(q) {
|
|
var v = q.first;
|
|
if (v !== undefined) {
|
|
return v.content;
|
|
}
|
|
|
|
}
|
|
|
|
function peekExn(q) {
|
|
var v = q.first;
|
|
if (v !== undefined) {
|
|
return v.content;
|
|
}
|
|
throw {
|
|
RE_EXN_ID: "Not_found",
|
|
Error: new Error()
|
|
};
|
|
}
|
|
|
|
function pop(q) {
|
|
var x = q.first;
|
|
if (x === undefined) {
|
|
return ;
|
|
}
|
|
var next = x.next;
|
|
if (next === undefined) {
|
|
clear(q);
|
|
return Caml_option.some(x.content);
|
|
} else {
|
|
q.length = q.length - 1 | 0;
|
|
q.first = next;
|
|
return Caml_option.some(x.content);
|
|
}
|
|
}
|
|
|
|
function popExn(q) {
|
|
var x = q.first;
|
|
if (x !== undefined) {
|
|
var next = x.next;
|
|
if (next === undefined) {
|
|
clear(q);
|
|
return x.content;
|
|
} else {
|
|
q.length = q.length - 1 | 0;
|
|
q.first = next;
|
|
return x.content;
|
|
}
|
|
}
|
|
throw {
|
|
RE_EXN_ID: "Not_found",
|
|
Error: new Error()
|
|
};
|
|
}
|
|
|
|
function popUndefined(q) {
|
|
var x = q.first;
|
|
if (x === undefined) {
|
|
return ;
|
|
}
|
|
var next = x.next;
|
|
if (next === undefined) {
|
|
clear(q);
|
|
return x.content;
|
|
} else {
|
|
q.length = q.length - 1 | 0;
|
|
q.first = next;
|
|
return x.content;
|
|
}
|
|
}
|
|
|
|
function copy(q) {
|
|
var qRes = {
|
|
length: q.length,
|
|
first: undefined,
|
|
last: undefined
|
|
};
|
|
var _prev;
|
|
var _cell = q.first;
|
|
while(true) {
|
|
var cell = _cell;
|
|
var prev = _prev;
|
|
if (cell !== undefined) {
|
|
var content = cell.content;
|
|
var res = {
|
|
content: content,
|
|
next: undefined
|
|
};
|
|
if (prev !== undefined) {
|
|
prev.next = res;
|
|
} else {
|
|
qRes.first = res;
|
|
}
|
|
_cell = cell.next;
|
|
_prev = res;
|
|
continue ;
|
|
}
|
|
qRes.last = prev;
|
|
return qRes;
|
|
};
|
|
}
|
|
|
|
function mapU(q, f) {
|
|
var qRes = {
|
|
length: q.length,
|
|
first: undefined,
|
|
last: undefined
|
|
};
|
|
var _prev;
|
|
var _cell = q.first;
|
|
while(true) {
|
|
var cell = _cell;
|
|
var prev = _prev;
|
|
if (cell !== undefined) {
|
|
var content = f(cell.content);
|
|
var res = {
|
|
content: content,
|
|
next: undefined
|
|
};
|
|
if (prev !== undefined) {
|
|
prev.next = res;
|
|
} else {
|
|
qRes.first = res;
|
|
}
|
|
_cell = cell.next;
|
|
_prev = res;
|
|
continue ;
|
|
}
|
|
qRes.last = prev;
|
|
return qRes;
|
|
};
|
|
}
|
|
|
|
function map(q, f) {
|
|
return mapU(q, Curry.__1(f));
|
|
}
|
|
|
|
function isEmpty(q) {
|
|
return q.length === 0;
|
|
}
|
|
|
|
function size(q) {
|
|
return q.length;
|
|
}
|
|
|
|
function forEachU(q, f) {
|
|
var _cell = q.first;
|
|
while(true) {
|
|
var cell = _cell;
|
|
if (cell === undefined) {
|
|
return ;
|
|
}
|
|
f(cell.content);
|
|
_cell = cell.next;
|
|
continue ;
|
|
};
|
|
}
|
|
|
|
function forEach(q, f) {
|
|
forEachU(q, Curry.__1(f));
|
|
}
|
|
|
|
function reduceU(q, accu, f) {
|
|
var _accu = accu;
|
|
var _cell = q.first;
|
|
while(true) {
|
|
var cell = _cell;
|
|
var accu$1 = _accu;
|
|
if (cell === undefined) {
|
|
return accu$1;
|
|
}
|
|
var accu$2 = f(accu$1, cell.content);
|
|
_cell = cell.next;
|
|
_accu = accu$2;
|
|
continue ;
|
|
};
|
|
}
|
|
|
|
function reduce(q, accu, f) {
|
|
return reduceU(q, accu, Curry.__2(f));
|
|
}
|
|
|
|
function transfer(q1, q2) {
|
|
if (q1.length <= 0) {
|
|
return ;
|
|
}
|
|
var l = q2.last;
|
|
if (l !== undefined) {
|
|
q2.length = q2.length + q1.length | 0;
|
|
l.next = q1.first;
|
|
q2.last = q1.last;
|
|
return clear(q1);
|
|
} else {
|
|
q2.length = q1.length;
|
|
q2.first = q1.first;
|
|
q2.last = q1.last;
|
|
return clear(q1);
|
|
}
|
|
}
|
|
|
|
function fillAux(_i, arr, _cell) {
|
|
while(true) {
|
|
var cell = _cell;
|
|
var i = _i;
|
|
if (cell === undefined) {
|
|
return ;
|
|
}
|
|
arr[i] = cell.content;
|
|
_cell = cell.next;
|
|
_i = i + 1 | 0;
|
|
continue ;
|
|
};
|
|
}
|
|
|
|
function toArray(x) {
|
|
var v = new Array(x.length);
|
|
fillAux(0, v, x.first);
|
|
return v;
|
|
}
|
|
|
|
function fromArray(arr) {
|
|
var q = {
|
|
length: 0,
|
|
first: undefined,
|
|
last: undefined
|
|
};
|
|
for(var i = 0 ,i_finish = arr.length; i < i_finish; ++i){
|
|
add(q, arr[i]);
|
|
}
|
|
return q;
|
|
}
|
|
|
|
exports.make = make;
|
|
exports.clear = clear;
|
|
exports.isEmpty = isEmpty;
|
|
exports.fromArray = fromArray;
|
|
exports.add = add;
|
|
exports.peek = peek;
|
|
exports.peekUndefined = peekUndefined;
|
|
exports.peekExn = peekExn;
|
|
exports.pop = pop;
|
|
exports.popUndefined = popUndefined;
|
|
exports.popExn = popExn;
|
|
exports.copy = copy;
|
|
exports.size = size;
|
|
exports.mapU = mapU;
|
|
exports.map = map;
|
|
exports.forEachU = forEachU;
|
|
exports.forEach = forEach;
|
|
exports.reduceU = reduceU;
|
|
exports.reduce = reduce;
|
|
exports.transfer = transfer;
|
|
exports.toArray = toArray;
|
|
/* No side effect */
|