{ lib, ... }: rec {
  /* Base raised to the power of the exponent.
     Type: pow :: int or float -> int -> int
     Args:
       base: The base.
       exponent: The exponent.
     Example:
       pow 0 1000
       => 0
       pow 1000 0
       => 1
       pow 2 30
       => 1073741824
       pow 3 3
       => 27
       pow (-5) 3
       => -125
  */
  pow = base: exponent:
    let inherit (lib) mod;
    in if exponent > 1 then
      let
        x = pow base (exponent / 2);
        odd_exp = mod exponent 2 == 1;
      in x * x * (if odd_exp then base else 1)
    else if exponent == 1 then
      base
    else if exponent == 0 && base == 0 then
      throw "undefined"
    else if exponent == 0 then
      1
    else
      throw "undefined";
}
