OOKNET                             [ /  search the index  ]  
──────────────────────────────────────────────────────────────────────────────────────
══════════════════════════════════════════════════════════════════════════════════════
OOKNET   [ /  search  ]  
────────────────────────────────────────────────
════════════════════════════════════════════════
 
 
main @ 208 LINES
 
[ HISTORY ]  [ UP ]
 

{
  math,
  types,
  lib,
}: let
  inherit (builtins) substring;
  inherit (lib) min max;
  hex = {
    toSet = string:
      types.hex.set {
        r = substring 0 2 string;
        g = substring 2 2 string;
        b = substring 4 2 string;
      };
    toRGB = let
      dictionary = {
        "0" = 0;
        "1" = 1;
        "2" = 2;
        "3" = 3;
        "4" = 4;
        "5" = 5;
        "6" = 6;
        "7" = 7;
        "8" = 8;
        "9" = 9;
        "a" = 10;
        "b" = 11;
        "c" = 12;
        "d" = 13;
        "e" = 14;
        "f" = 15;
        "A" = 10;
        "B" = 11;
        "C" = 12;
        "D" = 13;
        "E" = 14;
        "F" = 15;
      };
    in {
      # Converts a hex pair directly to RGB value (0-255)
      pair = hexPair: let
        high = dictionary.${substring 0 1 hexPair};
        low = dictionary.${substring 1 1 hexPair};
      in
        (high * 16) + low;

      # Converts a hex set to RGB set
      set = hexSet:
        types.rgb.set {
          r = hex.toRGB.pair hexSet.r;
          g = hex.toRGB.pair hexSet.g;
          b = hex.toRGB.pair hexSet.b;
        };
      string = hexStr: let
        rgbSet = hex.toRGB.set (hex.toSet hexStr);
      in
        types.rgb.string rgbSet.r rgbSet.g rgbSet.b;
    };
    toHSL = {
      set = hexStr: let
        rgbSet = hex.toRGB.set (hex.toSet hexStr);
      in
        rgb.toHSL.set rgbSet;

      string = hexStr: let
        hslSet = hex.toHSL.set hexStr;
      in
        types.hsl.string hslSet.h hslSet.s hslSet.l;
    };
  };
  rgb = {
    toHex = {
      set = rgbSet: let
        # Convert decimal to two-digit hex
        toHexPair = num: let
          hex = lib.toLower (lib.toHexString num);
          # Pad with leading zero if single digit
          padded =
            if (builtins.stringLength hex) == 1
            then "0${hex}"
            else hex;
        in
          padded;
      in
        types.hex.set {
          r = toHexPair rgbSet.r;
          g = toHexPair rgbSet.g;
          b = toHexPair rgbSet.b;
        };

      string = rgbStr: let
        hexSet = rgb.toHex.set rgbStr;
      in
        types.hex.string hexSet.r hexSet.g hexSet.b;
    };
    toHSL = {
      set = rgbSet: let
        # Normalize RGB values to 0-1 range
        r = rgbSet.r / 255.0;
        g = rgbSet.g / 255.0;
        b = rgbSet.b / 255.0;

        # Find min, max and delta
        c_max = max (max r g) b;
        c_min = min (min r g) b;
        delta = c_max - c_min;

        # Calculate HSL values
        h =
          if delta == 0.0
          then 0.0
          else if c_max == r
          then 60.0 * (math.mod ((g - b) / delta) 6)
          else if c_max == g
          then 60.0 * ((b - r) / delta + 2)
          else 60.0 * ((r - g) / delta + 4);

        l = (c_max + c_min) / 2;

        s =
          if delta == 0.0
          then 0.0
          else delta / (1 - (math.abs (2 * l - 1)));
      in
        types.hsl.set {
          inherit h;
          s = math.clamp 0.0 1.0 s;
          l = math.clamp 0.0 1.0 l;
        };

      string = rgbStr: let
        hslSet = rgb.toHSL.set (hex.toRGB.set (hex.toSet rgbStr));
      in
        types.hsl.string hslSet.h hslSet.s hslSet.l;
    };
  };
  hsl = {
    toRGB = {
      set = hslSet: let
        inherit (hslSet) h s l;

        # Calculate chroma
        c = (1 - (math.abs (2 * l - 1))) * s;
        # Calculate h prime (h')
        hp = h / 60.0;
        # Calculate x
        x = c * (1 - math.abs ((math.mod hp 2) - 1));
        # Calculate m
        m = l - c / 2;

        # Get initial RGB values based on h'
        rgb' =
          if hp <= 1
          then {
            r = c;
            g = x;
            b = 0;
          }
          else if hp <= 2
          then {
            r = x;
            g = c;
            b = 0;
          }
          else if hp <= 3
          then {
            r = 0;
            g = c;
            b = x;
          }
          else if hp <= 4
          then {
            r = 0;
            g = x;
            b = c;
          }
          else if hp <= 5
          then {
            r = x;
            g = 0;
            b = c;
          }
          else {
            r = c;
            g = 0;
            b = x;
          };
        # Final RGB values
      in
        types.rgb.set {
          r = math.round ((rgb'.r + m) * 255);
          g = math.round ((rgb'.g + m) * 255);
          b = math.round ((rgb'.b + m) * 255);
        };

      string = hslStr: let
        rgbSet = hsl.toRGB.set hslStr;
      in
        types.rgb.string rgbSet.r rgbSet.g rgbSet.b;
    };
    toHex = {
      set = {};
      string = color: color;
    };
  };
in {inherit hex hsl rgb;}

{
  math,
  types,
  lib,
}: let
  inherit (builtins) substring;
  inherit (lib) min max;
  hex = {
    toSet = string:
      types.hex.set {
        r = substring 0 2 string;
        g = substring 2 2 string;
        b = substring 4 2 string;
      };
    toRGB = let
      dictionary = {
        "0" = 0;
        "1" = 1;
        "2" = 2;
        "3" = 3;
        "4" = 4;
        "5" = 5;
        "6" = 6;
        "7" = 7;
        "8" = 8;
        "9" = 9;
        "a" = 10;
        "b" = 11;
        "c" = 12;
        "d" = 13;
        "e" = 14;
        "f" = 15;
        "A" = 10;
        "B" = 11;
        "C" = 12;
        "D" = 13;
        "E" = 14;
        "F" = 15;
      };
    in {
      # Converts a hex pair directly to RGB 
value (0-255)
      pair = hexPair: let
        high = dictionary.${substring 0 1 he
xPair};
        low = dictionary.${substring 1 1 hex
Pair};
      in
        (high * 16) + low;

      # Converts a hex set to RGB set
      set = hexSet:
        types.rgb.set {
          r = hex.toRGB.pair hexSet.r;
          g = hex.toRGB.pair hexSet.g;
          b = hex.toRGB.pair hexSet.b;
        };
      string = hexStr: let
        rgbSet = hex.toRGB.set (hex.toSet he
xStr);
      in
        types.rgb.string rgbSet.r rgbSet.g r
gbSet.b;
    };
    toHSL = {
      set = hexStr: let
        rgbSet = hex.toRGB.set (hex.toSet he
xStr);
      in
        rgb.toHSL.set rgbSet;

      string = hexStr: let
        hslSet = hex.toHSL.set hexStr;
      in
        types.hsl.string hslSet.h hslSet.s h
slSet.l;
    };
  };
  rgb = {
    toHex = {
      set = rgbSet: let
        # Convert decimal to two-digit hex
        toHexPair = num: let
          hex = lib.toLower (lib.toHexString
 num);
          # Pad with leading zero if single 
digit
          padded =
            if (builtins.stringLength hex) =
= 1
            then "0${hex}"
            else hex;
        in
          padded;
      in
        types.hex.set {
          r = toHexPair rgbSet.r;
          g = toHexPair rgbSet.g;
          b = toHexPair rgbSet.b;
        };

      string = rgbStr: let
        hexSet = rgb.toHex.set rgbStr;
      in
        types.hex.string hexSet.r hexSet.g h
exSet.b;
    };
    toHSL = {
      set = rgbSet: let
        # Normalize RGB values to 0-1 range
        r = rgbSet.r / 255.0;
        g = rgbSet.g / 255.0;
        b = rgbSet.b / 255.0;

        # Find min, max and delta
        c_max = max (max r g) b;
        c_min = min (min r g) b;
        delta = c_max - c_min;

        # Calculate HSL values
        h =
          if delta == 0.0
          then 0.0
          else if c_max == r
          then 60.0 * (math.mod ((g - b) / d
elta) 6)
          else if c_max == g
          then 60.0 * ((b - r) / delta + 2)
          else 60.0 * ((r - g) / delta + 4);

        l = (c_max + c_min) / 2;

        s =
          if delta == 0.0
          then 0.0
          else delta / (1 - (math.abs (2 * l
 - 1)));
      in
        types.hsl.set {
          inherit h;
          s = math.clamp 0.0 1.0 s;
          l = math.clamp 0.0 1.0 l;
        };

      string = rgbStr: let
        hslSet = rgb.toHSL.set (hex.toRGB.se
t (hex.toSet rgbStr));
      in
        types.hsl.string hslSet.h hslSet.s h
slSet.l;
    };
  };
  hsl = {
    toRGB = {
      set = hslSet: let
        inherit (hslSet) h s l;

        # Calculate chroma
        c = (1 - (math.abs (2 * l - 1))) * s
;
        # Calculate h prime (h')
        hp = h / 60.0;
        # Calculate x
        x = c * (1 - math.abs ((math.mod hp 
2) - 1));
        # Calculate m
        m = l - c / 2;

        # Get initial RGB values based on h'
        rgb' =
          if hp <= 1
          then {
            r = c;
            g = x;
            b = 0;
          }
          else if hp <= 2
          then {
            r = x;
            g = c;
            b = 0;
          }
          else if hp <= 3
          then {
            r = 0;
            g = c;
            b = x;
          }
          else if hp <= 4
          then {
            r = 0;
            g = x;
            b = c;
          }
          else if hp <= 5
          then {
            r = x;
            g = 0;
            b = c;
          }
          else {
            r = c;
            g = 0;
            b = x;
          };
        # Final RGB values
      in
        types.rgb.set {
          r = math.round ((rgb'.r + m) * 255
);
          g = math.round ((rgb'.g + m) * 255
);
          b = math.round ((rgb'.b + m) * 255
);
        };

      string = hslStr: let
        rgbSet = hsl.toRGB.set hslStr;
      in
        types.rgb.string rgbSet.r rgbSet.g r
gbSet.b;
    };
    toHex = {
      set = {};
      string = color: color;
    };
  };
in {inherit hex hsl rgb;}
 
──────────────────────────────────────────────────────────────────────────────────────
OOKNET
────────────────────────────────────────────────
OOKNET