Skip to content

Instantly share code, notes, and snippets.

@bobzhang
Created April 16, 2016 20:59
Show Gist options
  • Save bobzhang/644ec90fe2d5e77abdc4717313f6eda5 to your computer and use it in GitHub Desktop.
Save bobzhang/644ec90fe2d5e77abdc4717313f6eda5 to your computer and use it in GitHub Desktop.
// Generated CODE, PLEASE EDIT WITH CARE
'use strict';
var invalid_argument = /* tuple */[
248,
"Invalid_argument",
-3
];
var not_found = /* tuple */[
248,
"Not_found",
-6
];
function height(param) {
if (param) {
return param[4];
}
else {
return 0;
}
}
function create(l, x, d, r) {
var hl = height(l);
var hr = height(r);
return /* Node */[
l,
x,
d,
r,
hl >= hr ? hl + 1 | 0 : hr + 1 | 0
];
}
function bal(l, x, d, r) {
var hl = l ? l[4] : 0;
var hr = r ? r[4] : 0;
if (hl > (hr + 2 | 0)) {
if (l) {
var lr = l[3];
var ld = l[2];
var lv = l[1];
var ll = l[0];
if (height(ll) >= height(lr)) {
return create(ll, lv, ld, create(lr, x, d, r));
}
else if (lr) {
return create(create(ll, lv, ld, lr[0]), lr[1], lr[2], create(lr[3], x, d, r));
}
else {
throw [
invalid_argument,
"Map.bal"
];
}
}
else {
throw [
invalid_argument,
"Map.bal"
];
}
}
else if (hr > (hl + 2 | 0)) {
if (r) {
var rr = r[3];
var rd = r[2];
var rv = r[1];
var rl = r[0];
if (height(rr) >= height(rl)) {
return create(create(l, x, d, rl), rv, rd, rr);
}
else if (rl) {
return create(create(l, x, d, rl[0]), rl[1], rl[2], create(rl[3], rv, rd, rr));
}
else {
throw [
invalid_argument,
"Map.bal"
];
}
}
else {
throw [
invalid_argument,
"Map.bal"
];
}
}
else {
return /* Node */[
l,
x,
d,
r,
hl >= hr ? hl + 1 | 0 : hr + 1 | 0
];
}
}
function add(x, data, param) {
if (param) {
var r = param[3];
var d = param[2];
var v = param[1];
var l = param[0];
var c = x - v | 0;
if (c) {
if (c < 0) {
return bal(add(x, data, l), v, d, r);
}
else {
return bal(l, v, d, add(x, data, r));
}
}
else {
return /* Node */[
l,
x,
data,
r,
param[4]
];
}
}
else {
return /* Node */[
/* Empty */0,
x,
data,
/* Empty */0,
1
];
}
}
function find(x, _param) {
while(true) {
var param = _param;
if (param) {
var c = x - param[1] | 0;
if (c) {
_param = c < 0 ? param[0] : param[3];
continue ;
}
else {
return param[2];
}
}
else {
throw not_found;
}
};
}
function test() {
var m = /* Empty */0;
for(var i = 0; i<= 1000000; ++i){
m = add(i, i, m);
}
for(var i$1 = 0; i$1<= 1000000; ++i$1){
find(i$1, m);
}
return /* () */0;
}
test(/* () */0);
/* Not a pure module */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment