'use strict'; var Caml = require("./caml.js"); var for_in = (function(o,foo){ for (var x in o) { foo(x) }}); var obj_dup = (function(x){ if(Array.isArray(x)){ var len = x.length var v = new Array(len) for(var i = 0 ; i < len ; ++i){ v[i] = x[i] } if(x.TAG !== undefined){ v.TAG = x.TAG // TODO this can be removed eventually } return v } return Object.assign({},x) }); var update_dummy = (function(x,y){ var k if(Array.isArray(y)){ for(k = 0; k < y.length ; ++k){ x[k] = y[k] } if(y.TAG !== undefined){ x.TAG = y.TAG } } else { for (var k in y){ x[k] = y[k] } } }); function compare(a, b) { if (a === b) { return 0; } var a_type = typeof a; var b_type = typeof b; switch (a_type) { case "boolean" : if (b_type === "boolean") { return Caml.bool_compare(a, b); } break; case "function" : if (b_type === "function") { throw { RE_EXN_ID: "Invalid_argument", _1: "compare: functional value", Error: new Error() }; } break; case "number" : if (b_type === "number") { return Caml.int_compare(a, b); } break; case "string" : if (b_type === "string") { return Caml.string_compare(a, b); } else { return 1; } case "undefined" : return -1; default: } switch (b_type) { case "string" : return -1; case "undefined" : return 1; default: if (a_type === "boolean") { return 1; } if (b_type === "boolean") { return -1; } if (a_type === "function") { return 1; } if (b_type === "function") { return -1; } if (a_type === "number") { if (b === null || b.BS_PRIVATE_NESTED_SOME_NONE !== undefined) { return 1; } else { return -1; } } if (b_type === "number") { if (a === null || a.BS_PRIVATE_NESTED_SOME_NONE !== undefined) { return -1; } else { return 1; } } if (a === null) { if (b.BS_PRIVATE_NESTED_SOME_NONE !== undefined) { return 1; } else { return -1; } } if (b === null) { if (a.BS_PRIVATE_NESTED_SOME_NONE !== undefined) { return -1; } else { return 1; } } if (a.BS_PRIVATE_NESTED_SOME_NONE !== undefined) { if (b.BS_PRIVATE_NESTED_SOME_NONE !== undefined) { return aux_obj_compare(a, b); } else { return -1; } } var tag_a = a.TAG | 0; var tag_b = b.TAG | 0; if (tag_a === 248) { return Caml.int_compare(a[1], b[1]); } if (tag_a === 251) { throw { RE_EXN_ID: "Invalid_argument", _1: "equal: abstract value", Error: new Error() }; } if (tag_a !== tag_b) { if (tag_a < tag_b) { return -1; } else { return 1; } } var len_a = a.length | 0; var len_b = b.length | 0; if (len_a === len_b) { if (Array.isArray(a)) { var _i = 0; while(true) { var i = _i; if (i === len_a) { return 0; } var res = compare(a[i], b[i]); if (res !== 0) { return res; } _i = i + 1 | 0; continue ; }; } else if ((a instanceof Date && b instanceof Date)) { return (a - b); } else { return aux_obj_compare(a, b); } } else if (len_a < len_b) { var _i$1 = 0; while(true) { var i$1 = _i$1; if (i$1 === len_a) { return -1; } var res$1 = compare(a[i$1], b[i$1]); if (res$1 !== 0) { return res$1; } _i$1 = i$1 + 1 | 0; continue ; }; } else { var _i$2 = 0; while(true) { var i$2 = _i$2; if (i$2 === len_b) { return 1; } var res$2 = compare(a[i$2], b[i$2]); if (res$2 !== 0) { return res$2; } _i$2 = i$2 + 1 | 0; continue ; }; } } } function aux_obj_compare(a, b) { var min_key_lhs = { contents: undefined }; var min_key_rhs = { contents: undefined }; var do_key = function (param, key) { var min_key = param[2]; var b = param[1]; if (!(!Object.prototype.hasOwnProperty.call(b, key) || compare(param[0][key], b[key]) > 0)) { return ; } var mk = min_key.contents; if (mk !== undefined && key >= mk) { return ; } else { min_key.contents = key; return ; } }; var partial_arg = [ a, b, min_key_rhs ]; var do_key_a = function (param) { return do_key(partial_arg, param); }; var partial_arg$1 = [ b, a, min_key_lhs ]; var do_key_b = function (param) { return do_key(partial_arg$1, param); }; for_in(a, do_key_a); for_in(b, do_key_b); var match = min_key_lhs.contents; var match$1 = min_key_rhs.contents; if (match !== undefined) { if (match$1 !== undefined) { return Caml.string_compare(match, match$1); } else { return -1; } } else if (match$1 !== undefined) { return 1; } else { return 0; } } function equal(a, b) { if (a === b) { return true; } var a_type = typeof a; if (a_type === "string" || a_type === "number" || a_type === "boolean" || a_type === "undefined" || a === null) { return false; } var b_type = typeof b; if (a_type === "function" || b_type === "function") { throw { RE_EXN_ID: "Invalid_argument", _1: "equal: functional value", Error: new Error() }; } if (b_type === "number" || b_type === "undefined" || b === null) { return false; } var tag_a = a.TAG | 0; var tag_b = b.TAG | 0; if (tag_a === 248) { return a[1] === b[1]; } if (tag_a === 251) { throw { RE_EXN_ID: "Invalid_argument", _1: "equal: abstract value", Error: new Error() }; } if (tag_a !== tag_b) { return false; } var len_a = a.length | 0; var len_b = b.length | 0; if (len_a === len_b) { if (Array.isArray(a)) { var _i = 0; while(true) { var i = _i; if (i === len_a) { return true; } if (!equal(a[i], b[i])) { return false; } _i = i + 1 | 0; continue ; }; } else if ((a instanceof Date && b instanceof Date)) { return !(a > b || a < b); } else { var result = { contents: true }; var do_key_a = function (key) { if (!Object.prototype.hasOwnProperty.call(b, key)) { result.contents = false; return ; } }; var do_key_b = function (key) { if (!Object.prototype.hasOwnProperty.call(a, key) || !equal(b[key], a[key])) { result.contents = false; return ; } }; for_in(a, do_key_a); if (result.contents) { for_in(b, do_key_b); } return result.contents; } } else { return false; } } function equal_null(x, y) { if (y !== null) { return equal(x, y); } else { return x === y; } } function equal_undefined(x, y) { if (y !== undefined) { return equal(x, y); } else { return x === y; } } function equal_nullable(x, y) { if (y == null) { return x === y; } else { return equal(x, y); } } function notequal(a, b) { return !equal(a, b); } function greaterequal(a, b) { return compare(a, b) >= 0; } function greaterthan(a, b) { return compare(a, b) > 0; } function lessequal(a, b) { return compare(a, b) <= 0; } function lessthan(a, b) { return compare(a, b) < 0; } function min(x, y) { if (compare(x, y) <= 0) { return x; } else { return y; } } function max(x, y) { if (compare(x, y) >= 0) { return x; } else { return y; } } exports.obj_dup = obj_dup; exports.update_dummy = update_dummy; exports.compare = compare; exports.equal = equal; exports.equal_null = equal_null; exports.equal_undefined = equal_undefined; exports.equal_nullable = equal_nullable; exports.notequal = notequal; exports.greaterequal = greaterequal; exports.greaterthan = greaterthan; exports.lessthan = lessthan; exports.lessequal = lessequal; exports.min = min; exports.max = max; /* No side effect */