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;
 | |
| }
 |