46 lines
1,006 B
Nix
46 lines
1,006 B
Nix
{lib}: let
|
|
inherit (lib) min max;
|
|
inherit (builtins) floor ceil;
|
|
|
|
# basic math functions
|
|
# credits to github:xddxdd/nix-math
|
|
|
|
abs = x:
|
|
if x < 0
|
|
then 0 - x
|
|
else x;
|
|
|
|
clamp = a: b: v: min (max v (min a b)) (max a b);
|
|
|
|
round = x:
|
|
if (x - floor x) < 0.5
|
|
then floor x
|
|
else ceil x;
|
|
|
|
hasFraction = x: let
|
|
splitted = lib.splitString "." (builtins.toString x);
|
|
in
|
|
builtins.length splitted >= 2 && builtins.length (builtins.filter (ch: ch != "0") (lib.stringToCharacters (builtins.elemAt splitted 1))) > 0;
|
|
|
|
div = a: b: let
|
|
divideExactly = !(hasFraction (1.0 * a / b));
|
|
offset =
|
|
if divideExactly
|
|
then 0
|
|
else (0 - 1);
|
|
in
|
|
if b < 0
|
|
then offset - div a (0 - b)
|
|
else if a < 0
|
|
then offset - div (0 - a) b
|
|
else floor (1.0 * a / b);
|
|
|
|
mod = a: b:
|
|
if b < 0
|
|
then 0 - mod (0 - a) (0 - b)
|
|
else if a < 0
|
|
then mod (b - mod (0 - a) b) b
|
|
else a - b * (div a b);
|
|
in {
|
|
inherit round mod abs hasFraction clamp;
|
|
}
|