182 lines
2.8 KiB
JavaScript
182 lines
2.8 KiB
JavaScript
|
|
|
|
import * as Curry from "./curry.js";
|
|
import * as Caml_exceptions from "./caml_exceptions.js";
|
|
|
|
var Empty = /* @__PURE__ */Caml_exceptions.create("Queue.Empty");
|
|
|
|
function create(param) {
|
|
return {
|
|
length: 0,
|
|
first: /* Nil */0,
|
|
last: /* Nil */0
|
|
};
|
|
}
|
|
|
|
function clear(q) {
|
|
q.length = 0;
|
|
q.first = /* Nil */0;
|
|
q.last = /* Nil */0;
|
|
}
|
|
|
|
function add(x, q) {
|
|
var cell = /* Cons */{
|
|
content: x,
|
|
next: /* Nil */0
|
|
};
|
|
var last = q.last;
|
|
if (last) {
|
|
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 match = q.first;
|
|
if (match) {
|
|
return match.content;
|
|
}
|
|
throw {
|
|
RE_EXN_ID: Empty,
|
|
Error: new Error()
|
|
};
|
|
}
|
|
|
|
function take(q) {
|
|
var match = q.first;
|
|
if (match) {
|
|
var content = match.content;
|
|
var next = match.next;
|
|
if (next) {
|
|
q.length = q.length - 1 | 0;
|
|
q.first = next;
|
|
return content;
|
|
} else {
|
|
clear(q);
|
|
return content;
|
|
}
|
|
}
|
|
throw {
|
|
RE_EXN_ID: Empty,
|
|
Error: new Error()
|
|
};
|
|
}
|
|
|
|
function copy(q) {
|
|
var q_res = {
|
|
length: q.length,
|
|
first: /* Nil */0,
|
|
last: /* Nil */0
|
|
};
|
|
var _prev = /* Nil */0;
|
|
var _cell = q.first;
|
|
while(true) {
|
|
var cell = _cell;
|
|
var prev = _prev;
|
|
if (cell) {
|
|
var next = cell.next;
|
|
var res = /* Cons */{
|
|
content: cell.content,
|
|
next: /* Nil */0
|
|
};
|
|
if (prev) {
|
|
prev.next = res;
|
|
} else {
|
|
q_res.first = res;
|
|
}
|
|
_cell = next;
|
|
_prev = res;
|
|
continue ;
|
|
}
|
|
q_res.last = prev;
|
|
return q_res;
|
|
};
|
|
}
|
|
|
|
function is_empty(q) {
|
|
return q.length === 0;
|
|
}
|
|
|
|
function length(q) {
|
|
return q.length;
|
|
}
|
|
|
|
function iter(f, q) {
|
|
var _cell = q.first;
|
|
while(true) {
|
|
var cell = _cell;
|
|
if (!cell) {
|
|
return ;
|
|
}
|
|
var next = cell.next;
|
|
Curry._1(f, cell.content);
|
|
_cell = next;
|
|
continue ;
|
|
};
|
|
}
|
|
|
|
function fold(f, accu, q) {
|
|
var _accu = accu;
|
|
var _cell = q.first;
|
|
while(true) {
|
|
var cell = _cell;
|
|
var accu$1 = _accu;
|
|
if (!cell) {
|
|
return accu$1;
|
|
}
|
|
var next = cell.next;
|
|
var accu$2 = Curry._2(f, accu$1, cell.content);
|
|
_cell = next;
|
|
_accu = accu$2;
|
|
continue ;
|
|
};
|
|
}
|
|
|
|
function transfer(q1, q2) {
|
|
if (q1.length <= 0) {
|
|
return ;
|
|
}
|
|
var last = q2.last;
|
|
if (last) {
|
|
q2.length = q2.length + q1.length | 0;
|
|
last.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);
|
|
}
|
|
}
|
|
|
|
var push = add;
|
|
|
|
var pop = take;
|
|
|
|
var top = peek;
|
|
|
|
export {
|
|
Empty ,
|
|
create ,
|
|
add ,
|
|
push ,
|
|
take ,
|
|
pop ,
|
|
peek ,
|
|
top ,
|
|
clear ,
|
|
copy ,
|
|
is_empty ,
|
|
length ,
|
|
iter ,
|
|
fold ,
|
|
transfer ,
|
|
}
|
|
/* No side effect */
|