{ stdlib, strings }:
let
  inherit (strings) wrap;
  inherit (stdlib.attrsets) mapAttrs' nameValuePair;
in rec {
  # String
  escapeCharacter = "";

  # String -> String
  escapeColor = color: "${escapeCharacter}[${color}m";

  # String
  resetCharacter = escapeColor "0";

  # String -> String -> String
  wrapWithColor = color: wrap color resetCharacter;

  # String -> String -> String
  wrapWithColor' = color: wrap (escapeColor color) resetCharacter;

  # AttrSet{String}
  colorMappings = {
    "black" = "0";
    "red" = "1";
    "green" = "2";
    "yellow" = "3";
    "blue" = "4";
    "magenta" = "5";
    "cyan" = "6";
    "white" = "7";
  };

  # AttrSet{(String -> String)}
  front = let
    # AttrSet{(String -> String)}
    names = mapAttrs' (n: v: nameValuePair n (wrapWithColor' ("3" + v))) colorMappings;

    # AttrSet{(String -> String)}
    numbers = mapAttrs' (n: v: nameValuePair v (wrapWithColor' ("3" + v))) colorMappings;
  in names // numbers;
  back = let
    # AttrSet{(String -> String)}
    names = mapAttrs' (n: v: nameValuePair n (wrapWithColor' ("4" + v))) colorMappings;

    # AttrSet{(String -> String)}
    numbers = mapAttrs' (n: v: nameValuePair v (wrapWithColor' ("4" + v))) colorMappings;
  in names // numbers;
}