UNPKG

bs-platform

Version:

bucklescript compiler, ocaml standard libary by bucklescript and its required runtime support

1,000 lines (992 loc) 26.1 kB
'use strict'; var List = require("./list.js"); var Curry = require("./curry.js"); var Caml_option = require("./caml_option.js"); var Caml_builtin_exceptions = require("./caml_builtin_exceptions.js"); function Make(funarg) { var height = function (param) { if (param) { return param[/* h */3]; } else { return 0; } }; var create = function (l, v, r) { var hl = l ? l[/* h */3] : 0; var hr = r ? r[/* h */3] : 0; return /* Node */[ /* l */l, /* v */v, /* r */r, /* h */hl >= hr ? hl + 1 | 0 : hr + 1 | 0 ]; }; var bal = function (l, v, r) { var hl = l ? l[/* h */3] : 0; var hr = r ? r[/* h */3] : 0; if (hl > (hr + 2 | 0)) { if (l) { var lr = l[/* r */2]; var lv = l[/* v */1]; var ll = l[/* l */0]; if (height(ll) >= height(lr)) { return create(ll, lv, create(lr, v, r)); } else if (lr) { return create(create(ll, lv, lr[/* l */0]), lr[/* v */1], create(lr[/* r */2], v, r)); } else { throw [ Caml_builtin_exceptions.invalid_argument, "Set.bal" ]; } } else { throw [ Caml_builtin_exceptions.invalid_argument, "Set.bal" ]; } } else if (hr > (hl + 2 | 0)) { if (r) { var rr = r[/* r */2]; var rv = r[/* v */1]; var rl = r[/* l */0]; if (height(rr) >= height(rl)) { return create(create(l, v, rl), rv, rr); } else if (rl) { return create(create(l, v, rl[/* l */0]), rl[/* v */1], create(rl[/* r */2], rv, rr)); } else { throw [ Caml_builtin_exceptions.invalid_argument, "Set.bal" ]; } } else { throw [ Caml_builtin_exceptions.invalid_argument, "Set.bal" ]; } } else { return /* Node */[ /* l */l, /* v */v, /* r */r, /* h */hl >= hr ? hl + 1 | 0 : hr + 1 | 0 ]; } }; var add = function (x, t) { if (t) { var r = t[/* r */2]; var v = t[/* v */1]; var l = t[/* l */0]; var c = Curry._2(funarg.compare, x, v); if (c === 0) { return t; } else if (c < 0) { var ll = add(x, l); if (l === ll) { return t; } else { return bal(ll, v, r); } } else { var rr = add(x, r); if (r === rr) { return t; } else { return bal(l, v, rr); } } } else { return /* Node */[ /* l : Empty */0, /* v */x, /* r : Empty */0, /* h */1 ]; } }; var singleton = function (x) { return /* Node */[ /* l : Empty */0, /* v */x, /* r : Empty */0, /* h */1 ]; }; var add_min_element = function (x, param) { if (param) { return bal(add_min_element(x, param[/* l */0]), param[/* v */1], param[/* r */2]); } else { return singleton(x); } }; var add_max_element = function (x, param) { if (param) { return bal(param[/* l */0], param[/* v */1], add_max_element(x, param[/* r */2])); } else { return singleton(x); } }; var join = function (l, v, r) { if (l) { if (r) { var rh = r[/* h */3]; var lh = l[/* h */3]; if (lh > (rh + 2 | 0)) { return bal(l[/* l */0], l[/* v */1], join(l[/* r */2], v, r)); } else if (rh > (lh + 2 | 0)) { return bal(join(l, v, r[/* l */0]), r[/* v */1], r[/* r */2]); } else { return create(l, v, r); } } else { return add_max_element(v, l); } } else { return add_min_element(v, r); } }; var min_elt = function (_param) { while(true) { var param = _param; if (param) { var l = param[/* l */0]; if (l) { _param = l; continue ; } else { return param[/* v */1]; } } else { throw Caml_builtin_exceptions.not_found; } }; }; var min_elt_opt = function (_param) { while(true) { var param = _param; if (param) { var l = param[/* l */0]; if (l) { _param = l; continue ; } else { return Caml_option.some(param[/* v */1]); } } else { return ; } }; }; var max_elt = function (_param) { while(true) { var param = _param; if (param) { var r = param[/* r */2]; if (r) { _param = r; continue ; } else { return param[/* v */1]; } } else { throw Caml_builtin_exceptions.not_found; } }; }; var max_elt_opt = function (_param) { while(true) { var param = _param; if (param) { var r = param[/* r */2]; if (r) { _param = r; continue ; } else { return Caml_option.some(param[/* v */1]); } } else { return ; } }; }; var remove_min_elt = function (param) { if (param) { var l = param[/* l */0]; if (l) { return bal(remove_min_elt(l), param[/* v */1], param[/* r */2]); } else { return param[/* r */2]; } } else { throw [ Caml_builtin_exceptions.invalid_argument, "Set.remove_min_elt" ]; } }; var concat = function (t1, t2) { if (t1) { if (t2) { return join(t1, min_elt(t2), remove_min_elt(t2)); } else { return t1; } } else { return t2; } }; var split = function (x, param) { if (param) { var r = param[/* r */2]; var v = param[/* v */1]; var l = param[/* l */0]; var c = Curry._2(funarg.compare, x, v); if (c === 0) { return /* tuple */[ l, true, r ]; } else if (c < 0) { var match = split(x, l); return /* tuple */[ match[0], match[1], join(match[2], v, r) ]; } else { var match$1 = split(x, r); return /* tuple */[ join(l, v, match$1[0]), match$1[1], match$1[2] ]; } } else { return /* tuple */[ /* Empty */0, false, /* Empty */0 ]; } }; var is_empty = function (param) { if (param) { return false; } else { return true; } }; var mem = function (x, _param) { while(true) { var param = _param; if (param) { var c = Curry._2(funarg.compare, x, param[/* v */1]); if (c === 0) { return true; } else { _param = c < 0 ? param[/* l */0] : param[/* r */2]; continue ; } } else { return false; } }; }; var remove = function (x, t) { if (t) { var r = t[/* r */2]; var v = t[/* v */1]; var l = t[/* l */0]; var c = Curry._2(funarg.compare, x, v); if (c === 0) { var t1 = l; var t2 = r; if (t1) { if (t2) { return bal(t1, min_elt(t2), remove_min_elt(t2)); } else { return t1; } } else { return t2; } } else if (c < 0) { var ll = remove(x, l); if (l === ll) { return t; } else { return bal(ll, v, r); } } else { var rr = remove(x, r); if (r === rr) { return t; } else { return bal(l, v, rr); } } } else { return /* Empty */0; } }; var union = function (s1, s2) { if (s1) { if (s2) { var h2 = s2[/* h */3]; var v2 = s2[/* v */1]; var h1 = s1[/* h */3]; var v1 = s1[/* v */1]; if (h1 >= h2) { if (h2 === 1) { return add(v2, s1); } else { var match = split(v1, s2); return join(union(s1[/* l */0], match[0]), v1, union(s1[/* r */2], match[2])); } } else if (h1 === 1) { return add(v1, s2); } else { var match$1 = split(v2, s1); return join(union(match$1[0], s2[/* l */0]), v2, union(match$1[2], s2[/* r */2])); } } else { return s1; } } else { return s2; } }; var inter = function (s1, s2) { if (s1 && s2) { var r1 = s1[/* r */2]; var v1 = s1[/* v */1]; var l1 = s1[/* l */0]; var match = split(v1, s2); var l2 = match[0]; if (match[1]) { return join(inter(l1, l2), v1, inter(r1, match[2])); } else { return concat(inter(l1, l2), inter(r1, match[2])); } } else { return /* Empty */0; } }; var diff = function (s1, s2) { if (s1) { if (s2) { var r1 = s1[/* r */2]; var v1 = s1[/* v */1]; var l1 = s1[/* l */0]; var match = split(v1, s2); var l2 = match[0]; if (match[1]) { return concat(diff(l1, l2), diff(r1, match[2])); } else { return join(diff(l1, l2), v1, diff(r1, match[2])); } } else { return s1; } } else { return /* Empty */0; } }; var cons_enum = function (_s, _e) { while(true) { var e = _e; var s = _s; if (s) { _e = /* More */[ s[/* v */1], s[/* r */2], e ]; _s = s[/* l */0]; continue ; } else { return e; } }; }; var compare = function (s1, s2) { var _e1 = cons_enum(s1, /* End */0); var _e2 = cons_enum(s2, /* End */0); while(true) { var e2 = _e2; var e1 = _e1; if (e1) { if (e2) { var c = Curry._2(funarg.compare, e1[0], e2[0]); if (c !== 0) { return c; } else { _e2 = cons_enum(e2[1], e2[2]); _e1 = cons_enum(e1[1], e1[2]); continue ; } } else { return 1; } } else if (e2) { return -1; } else { return 0; } }; }; var equal = function (s1, s2) { return compare(s1, s2) === 0; }; var subset = function (_s1, _s2) { while(true) { var s2 = _s2; var s1 = _s1; if (s1) { if (s2) { var r2 = s2[/* r */2]; var l2 = s2[/* l */0]; var r1 = s1[/* r */2]; var v1 = s1[/* v */1]; var l1 = s1[/* l */0]; var c = Curry._2(funarg.compare, v1, s2[/* v */1]); if (c === 0) { if (subset(l1, l2)) { _s2 = r2; _s1 = r1; continue ; } else { return false; } } else if (c < 0) { if (subset(/* Node */[ /* l */l1, /* v */v1, /* r : Empty */0, /* h */0 ], l2)) { _s1 = r1; continue ; } else { return false; } } else if (subset(/* Node */[ /* l : Empty */0, /* v */v1, /* r */r1, /* h */0 ], r2)) { _s1 = l1; continue ; } else { return false; } } else { return false; } } else { return true; } }; }; var iter = function (f, _param) { while(true) { var param = _param; if (param) { iter(f, param[/* l */0]); Curry._1(f, param[/* v */1]); _param = param[/* r */2]; continue ; } else { return /* () */0; } }; }; var fold = function (f, _s, _accu) { while(true) { var accu = _accu; var s = _s; if (s) { _accu = Curry._2(f, s[/* v */1], fold(f, s[/* l */0], accu)); _s = s[/* r */2]; continue ; } else { return accu; } }; }; var for_all = function (p, _param) { while(true) { var param = _param; if (param) { if (Curry._1(p, param[/* v */1]) && for_all(p, param[/* l */0])) { _param = param[/* r */2]; continue ; } else { return false; } } else { return true; } }; }; var exists = function (p, _param) { while(true) { var param = _param; if (param) { if (Curry._1(p, param[/* v */1]) || exists(p, param[/* l */0])) { return true; } else { _param = param[/* r */2]; continue ; } } else { return false; } }; }; var filter = function (p, t) { if (t) { var r = t[/* r */2]; var v = t[/* v */1]; var l = t[/* l */0]; var l$prime = filter(p, l); var pv = Curry._1(p, v); var r$prime = filter(p, r); if (pv) { if (l === l$prime && r === r$prime) { return t; } else { return join(l$prime, v, r$prime); } } else { return concat(l$prime, r$prime); } } else { return /* Empty */0; } }; var partition = function (p, param) { if (param) { var v = param[/* v */1]; var match = partition(p, param[/* l */0]); var lf = match[1]; var lt = match[0]; var pv = Curry._1(p, v); var match$1 = partition(p, param[/* r */2]); var rf = match$1[1]; var rt = match$1[0]; if (pv) { return /* tuple */[ join(lt, v, rt), concat(lf, rf) ]; } else { return /* tuple */[ concat(lt, rt), join(lf, v, rf) ]; } } else { return /* tuple */[ /* Empty */0, /* Empty */0 ]; } }; var cardinal = function (param) { if (param) { return (cardinal(param[/* l */0]) + 1 | 0) + cardinal(param[/* r */2]) | 0; } else { return 0; } }; var elements_aux = function (_accu, _param) { while(true) { var param = _param; var accu = _accu; if (param) { _param = param[/* l */0]; _accu = /* :: */[ param[/* v */1], elements_aux(accu, param[/* r */2]) ]; continue ; } else { return accu; } }; }; var elements = function (s) { return elements_aux(/* [] */0, s); }; var find = function (x, _param) { while(true) { var param = _param; if (param) { var v = param[/* v */1]; var c = Curry._2(funarg.compare, x, v); if (c === 0) { return v; } else { _param = c < 0 ? param[/* l */0] : param[/* r */2]; continue ; } } else { throw Caml_builtin_exceptions.not_found; } }; }; var find_first = function (f, _param) { while(true) { var param = _param; if (param) { var v = param[/* v */1]; if (Curry._1(f, v)) { var _v0 = v; var f$1 = f; var _param$1 = param[/* l */0]; while(true) { var param$1 = _param$1; var v0 = _v0; if (param$1) { var v$1 = param$1[/* v */1]; if (Curry._1(f$1, v$1)) { _param$1 = param$1[/* l */0]; _v0 = v$1; continue ; } else { _param$1 = param$1[/* r */2]; continue ; } } else { return v0; } }; } else { _param = param[/* r */2]; continue ; } } else { throw Caml_builtin_exceptions.not_found; } }; }; var find_first_opt = function (f, _param) { while(true) { var param = _param; if (param) { var v = param[/* v */1]; if (Curry._1(f, v)) { var _v0 = v; var f$1 = f; var _param$1 = param[/* l */0]; while(true) { var param$1 = _param$1; var v0 = _v0; if (param$1) { var v$1 = param$1[/* v */1]; if (Curry._1(f$1, v$1)) { _param$1 = param$1[/* l */0]; _v0 = v$1; continue ; } else { _param$1 = param$1[/* r */2]; continue ; } } else { return Caml_option.some(v0); } }; } else { _param = param[/* r */2]; continue ; } } else { return ; } }; }; var find_last = function (f, _param) { while(true) { var param = _param; if (param) { var v = param[/* v */1]; if (Curry._1(f, v)) { var _v0 = v; var f$1 = f; var _param$1 = param[/* r */2]; while(true) { var param$1 = _param$1; var v0 = _v0; if (param$1) { var v$1 = param$1[/* v */1]; if (Curry._1(f$1, v$1)) { _param$1 = param$1[/* r */2]; _v0 = v$1; continue ; } else { _param$1 = param$1[/* l */0]; continue ; } } else { return v0; } }; } else { _param = param[/* l */0]; continue ; } } else { throw Caml_builtin_exceptions.not_found; } }; }; var find_last_opt = function (f, _param) { while(true) { var param = _param; if (param) { var v = param[/* v */1]; if (Curry._1(f, v)) { var _v0 = v; var f$1 = f; var _param$1 = param[/* r */2]; while(true) { var param$1 = _param$1; var v0 = _v0; if (param$1) { var v$1 = param$1[/* v */1]; if (Curry._1(f$1, v$1)) { _param$1 = param$1[/* r */2]; _v0 = v$1; continue ; } else { _param$1 = param$1[/* l */0]; continue ; } } else { return Caml_option.some(v0); } }; } else { _param = param[/* l */0]; continue ; } } else { return ; } }; }; var find_opt = function (x, _param) { while(true) { var param = _param; if (param) { var v = param[/* v */1]; var c = Curry._2(funarg.compare, x, v); if (c === 0) { return Caml_option.some(v); } else { _param = c < 0 ? param[/* l */0] : param[/* r */2]; continue ; } } else { return ; } }; }; var map = function (f, t) { if (t) { var r = t[/* r */2]; var v = t[/* v */1]; var l = t[/* l */0]; var l$prime = map(f, l); var v$prime = Curry._1(f, v); var r$prime = map(f, r); if (l === l$prime && v === v$prime && r === r$prime) { return t; } else { var l$1 = l$prime; var v$1 = v$prime; var r$1 = r$prime; if ((l$1 === /* Empty */0 || Curry._2(funarg.compare, max_elt(l$1), v$1) < 0) && (r$1 === /* Empty */0 || Curry._2(funarg.compare, v$1, min_elt(r$1)) < 0)) { return join(l$1, v$1, r$1); } else { return union(l$1, add(v$1, r$1)); } } } else { return /* Empty */0; } }; var of_list = function (l) { if (l) { var match = l[1]; var x0 = l[0]; if (match) { var match$1 = match[1]; var x1 = match[0]; if (match$1) { var match$2 = match$1[1]; var x2 = match$1[0]; if (match$2) { var match$3 = match$2[1]; var x3 = match$2[0]; if (match$3) { if (match$3[1]) { var l$1 = List.sort_uniq(funarg.compare, l); var sub = function (n, l) { switch (n) { case 0 : return /* tuple */[ /* Empty */0, l ]; case 1 : if (l) { return /* tuple */[ /* Node */[ /* l : Empty */0, /* v */l[0], /* r : Empty */0, /* h */1 ], l[1] ]; } break; case 2 : if (l) { var match = l[1]; if (match) { return /* tuple */[ /* Node */[ /* l : Node */[ /* l : Empty */0, /* v */l[0], /* r : Empty */0, /* h */1 ], /* v */match[0], /* r : Empty */0, /* h */2 ], match[1] ]; } } break; case 3 : if (l) { var match$1 = l[1]; if (match$1) { var match$2 = match$1[1]; if (match$2) { return /* tuple */[ /* Node */[ /* l : Node */[ /* l : Empty */0, /* v */l[0], /* r : Empty */0, /* h */1 ], /* v */match$1[0], /* r : Node */[ /* l : Empty */0, /* v */match$2[0], /* r : Empty */0, /* h */1 ], /* h */2 ], match$2[1] ]; } } } break; default: } var nl = n / 2 | 0; var match$3 = sub(nl, l); var l$1 = match$3[1]; if (l$1) { var match$4 = sub((n - nl | 0) - 1 | 0, l$1[1]); return /* tuple */[ create(match$3[0], l$1[0], match$4[0]), match$4[1] ]; } else { throw [ Caml_builtin_exceptions.assert_failure, /* tuple */[ "set.ml", 510, 18 ] ]; } }; return sub(List.length(l$1), l$1)[0]; } else { return add(match$3[0], add(x3, add(x2, add(x1, singleton(x0))))); } } else { return add(x3, add(x2, add(x1, singleton(x0)))); } } else { return add(x2, add(x1, singleton(x0))); } } else { return add(x1, singleton(x0)); } } else { return singleton(x0); } } else { return /* Empty */0; } }; return { empty: /* Empty */0, is_empty: is_empty, mem: mem, add: add, singleton: singleton, remove: remove, union: union, inter: inter, diff: diff, compare: compare, equal: equal, subset: subset, iter: iter, map: map, fold: fold, for_all: for_all, exists: exists, filter: filter, partition: partition, cardinal: cardinal, elements: elements, min_elt: min_elt, min_elt_opt: min_elt_opt, max_elt: max_elt, max_elt_opt: max_elt_opt, choose: min_elt, choose_opt: min_elt_opt, split: split, find: find, find_opt: find_opt, find_first: find_first, find_first_opt: find_first_opt, find_last: find_last, find_last_opt: find_last_opt, of_list: of_list }; } exports.Make = Make; /* No side effect */