bahaghari/lib: add grow' and isWithinRange

Also updated the order of the arguments to make it more usable in
functional programming paradigm or whatever.
This commit is contained in:
Gabriel Arazas 2024-03-02 12:54:59 +08:00
parent 56463dec13
commit 0b7b3ffd7d
No known key found for this signature in database
GPG Key ID: ADE0C41DAB221FCC
2 changed files with 49 additions and 12 deletions

View File

@ -41,6 +41,20 @@ rec {
in in
if exponent < 0 then (1 / value) else value; if exponent < 0 then (1 / value) else value;
/* Returns a boolean whether the given number is within the given (inclusive) range.
Type: isWithinRange :: Number -> Number -> Number -> Bool
Example:
isWithinRange 30 50 6
=> false
isWithinRange 0 100 75
=> true
*/
isWithinRange = min: max: number:
(pkgs.lib.max number min) <= (pkgs.lib.min number max);
/* Given a number, make it grow by given amount of percentage. /* Given a number, make it grow by given amount of percentage.
A value of 100 should make the number doubled. A value of 100 should make the number doubled.
@ -53,23 +67,26 @@ rec {
grow 55.5 100 grow 55.5 100
=> 111 => 111
*/ */
grow = number: value: grow = value: number:
number + (percentage number value); number + (percentage number value);
/* Given a number, make it smaller by given amount of percentage. /* Similar to `grow` but only limits to be within the given (inclusive)
A value of 100 should zero the number. range.
Type: shrink :: Number -> Number -> Number Type: grow' :: Number -> Number -> Number -> Number
Example: Example:
shrink 4 50.0 grow' 0 255 12 100
=> 2 => 24
shrink 55.5 100 grow' 1 10 5 (-200)
=> 0 => 1
*/ */
shrink = number: value: grow' = min: max: value: number:
number - (percentage number value); let
res = grow number value;
in
pkgs.lib.min max (pkgs.lib.max res min);
/* Given a number, return its value by the given percentage. /* Given a number, return its value by the given percentage.

View File

@ -37,15 +37,25 @@ pkgs.lib.runTests {
}; };
testMathGrow = { testMathGrow = {
expr = lib.math.grow 12 500; expr = lib.math.grow 500 12;
expected = 72; expected = 72;
}; };
testMathGrow2 = { testMathGrow2 = {
expr = lib.math.grow 5.5 55.5; expr = lib.math.grow 55.5 5.5;
expected = 8.5525; expected = 8.5525;
}; };
testMathGrowVariantMax = {
expr = lib.math.grow' 0 255 130 100;
expected = 255;
};
testMathGrowVariantMin = {
expr = lib.math.grow' 0 255 130 (-500);
expected = 0;
};
testMathRoundDown = { testMathRoundDown = {
expr = lib.math.round 2.3; expr = lib.math.round 2.3;
expected = 2; expected = 2;
@ -55,4 +65,14 @@ pkgs.lib.runTests {
expr = lib.math.round 2.8; expr = lib.math.round 2.8;
expected = 3; expected = 3;
}; };
testMathWithinRange = {
expr = lib.math.isWithinRange (-100) 100 50;
expected = true;
};
testMathWithinRange2 = {
expr = lib.math.isWithinRange 5 10 (-5);
expected = false;
};
} }