'use strict'; /*@ Ox.asinh Inverse hyperbolic sine Missing from Math. @*/ Ox.asinh = function(x) { // fixme: no test return Math.log(x + Math.sqrt(x * x + 1)); }; /*@ Ox.deg Takes radians, returns degrees Missing from Math. > Ox.deg(2 * Math.PI) 360 @*/ Ox.deg = function(rad) { return rad * 180 / Math.PI; }; /*@ Ox.divideInt Divides a number by another and returns an array of integers Ox.divideInt(num, by) returns a sorted array of integers that has a sum of num, a length of by, a minimum of Math.floor(num / by) and a maximum of Math.ceil(num / by). > Ox.divideInt(100, 3) [33, 33, 34] > Ox.divideInt(100, 6) [16, 16, 17, 17, 17, 17] @*/ // fixme: is splitInt a better name? Ox.divideInt = function(num, by) { var div = parseInt(num / by), mod = num % by; return Ox.range(by).map(function(i) { return div + (i > by - 1 - mod); }); }; /*@ Ox.limit Limits a number by a given mininum and maximum Ox.limit(num, min, max) is a shorthand for Math.min(Math.max(num, min), max) (num) -> num (num, max) -> Math.max(num, max) (num, min, max) -> Math.min(Math.max(num, min), max) num number min minimum max maximum > Ox.limit(1, 2, 3) 2 > Ox.limit(4, 2, 3) 3 > Ox.limit(2, 1) 1 > Ox.limit(-1, -2) -2 @*/ Ox.limit = function(/*num[[, min], max]*/) { var len = arguments.length, num = arguments[0], min = len == 3 ? arguments[1] : -Infinity, max = arguments[len - 1]; return Math.min(Math.max(num, min), max); }; /*@ Ox.log Returns the logarithm of a given number to a given base Missing from Math. > Ox.log(100, 10) 2 > Ox.log(Math.E) 1 @*/ Ox.log = function(num, base) { return Math.log(num) / Math.log(base || Math.E); }; /*@ Ox.mod Modulo function Unlike -1 % 10, which returns -1, Ox.mod(-1, 10) returns 9. > Ox.mod(11, 10) 1 > Ox.mod(-11, 10) 9 @*/ Ox.mod = function(num, by) { return (num % by + by) % by; }; /*@ Ox.rad Takes degrees, returns radians Missing from Math. > Ox.rad(360) 2 * Math.PI @*/ Ox.rad = function(deg) { return deg * Math.PI / 180; }; /*@ Ox.random Returns a random integer within a given range () -> 0 or 1 (max) -> Integer between 0 (inclusive) and max (exclusive) (min, max) -> Integer between min (inclusive) and max (exclusive) > [0, 1].indexOf(Ox.random()) > -1 true > [0, 1, 2].indexOf(Ox.random(3)) > -1 true > Ox.random(1, 2) == 1 true @*/ Ox.random = function() { var len = arguments.length, min = len == 2 ? arguments[0] : 0, max = len ? arguments[len - 1] : 2; return min + Math.floor(Math.random() * (max - min)); }; /*@ Ox.round Rounds a number with a given number of decimals > Ox.round(2 / 3, 6) 0.666667 > Ox.round(1 / 2, 3) 0.5 > Ox.round(1 / 2) 1 @*/ Ox.round = function(num, dec) { var pow = Math.pow(10, dec || 0); return Math.round(num * pow) / pow; }; /*@ Ox.sinh Hyperbolic sine Missing from Math. @*/ Ox.sinh = function(x) { // fixme: no test return (Math.exp(x) - Math.exp(-x)) / 2; };