From f882c30209caf811a127962503bf02f7e527a858 Mon Sep 17 00:00:00 2001 From: Gabriel Arazas Date: Tue, 21 May 2024 20:27:12 +0800 Subject: [PATCH] bahaghari/lib: add `isNumber` and `scale` --- subprojects/bahaghari/lib/default.nix | 3 +- subprojects/bahaghari/lib/trivial.nix | 35 +++++++++++++++++++ .../bahaghari/tests/lib/trivial/default.nix | 35 +++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) diff --git a/subprojects/bahaghari/lib/default.nix b/subprojects/bahaghari/lib/default.nix index b2a80a75..f88ed713 100644 --- a/subprojects/bahaghari/lib/default.nix +++ b/subprojects/bahaghari/lib/default.nix @@ -38,7 +38,8 @@ pkgs.lib.makeExtensible tinted-theming = callLibs ./tinted-theming.nix; inherit (self.trivial) importYAML toYAML toBaseDigitsWithGlyphs - generateGlyphSet generateConversionTable generateBaseDigitType clamp; + generateGlyphSet generateConversionTable generateBaseDigitType clamp + isNumber scale; inherit (self.hex) isHexString; inherit (self.math) abs pow percentage; diff --git a/subprojects/bahaghari/lib/trivial.nix b/subprojects/bahaghari/lib/trivial.nix index 9c559361..f70f3eee 100644 --- a/subprojects/bahaghari/lib/trivial.nix +++ b/subprojects/bahaghari/lib/trivial.nix @@ -160,4 +160,39 @@ rec { */ clamp = min: max: value: lib.min max (lib.max min value); + + /* Given a value, check if it's a number type. + + Type: isNumber :: Number -> bool + + Example: + isNumber 3.0 + => true + + isNumber 653 + => true + + isNumber true + => false + */ + isNumber = v: + lib.isInt v || lib.isFloat v; + + /* Given an initial range of integers, scale the given number with its own + set of range. + + Type: scale :: Attrs -> Number -> Number + + Example: + scale { inMin = 0; inMax = 15; outMin = 0; outMax = 255; } 4 + => 68 + + scale { inMin = 0; inMax = 15; outMin = 0; outMax = 255; } (-4) + => -68 + + scale { inMin = 0; inMax = 15; outMin = 0; outMax = 255; } 15 + => 255 + */ + scale = { inMin, inMax, outMin, outMax }: v: + ((v - inMin) * (outMax - outMin)) / ((inMax - inMin) + outMin); } diff --git a/subprojects/bahaghari/tests/lib/trivial/default.nix b/subprojects/bahaghari/tests/lib/trivial/default.nix index 9d311271..fd318e1d 100644 --- a/subprojects/bahaghari/tests/lib/trivial/default.nix +++ b/subprojects/bahaghari/tests/lib/trivial/default.nix @@ -225,4 +225,39 @@ lib.runTests { expr = self.trivial.clamp 1 10 453; expected = 10; }; + + testNumberScale = { + expr = self.trivial.scale { inMin = 0; inMax = 15; outMin = 0; outMax = 255; } 15; + expected = 255; + }; + + testNumberScale2 = { + expr = self.trivial.scale { inMin = 0; inMax = 15; outMin = 0; outMax = 255; } 4; + expected = 68; + }; + + testNumberScale3 = { + expr = self.trivial.scale { inMin = 0; inMax = 15; outMin = 0; outMax = 255; } (-4); + expected = (-68); + }; + + testIsNumber1 = { + expr = self.trivial.isNumber 3; + expected = true; + }; + + testIsNumber2 = { + expr = self.trivial.isNumber 4.09; + expected = true; + }; + + testIsNumber3 = { + expr = self.trivial.isNumber "HELLO"; + expected = false; + }; + + testIsNumber4 = { + expr = self.trivial.isNumber true; + expected = false; + }; }