text: /**
   * The `Semiring` class is for types that support an addition and multiplication operation.
   *
   * Instances must satisfy the following laws:
   *
   * - Commutative monoid under addition:
   *   - Associativity: `(a + b) + c = a + (b + c)`
   *   - Identity: `zero + a = a + zero = a`
   *   - Commutative: `a + b = b + a`
   * - Monoid under multiplication:
   *   - Associativity: `(a * b) * c = a * (b * c)`
   *   - Identity: `one * a = a * one = a`
   * - Multiplication distributes over addition:
   *   - Left distributivity: `a * (b + c) = (a * b) + (a * c)`
   *   - Right distributivity: `(a + b) * c = (a * c) + (b * c)`
   * - Annihilation: `zero * a = a * zero = zero`
   *
   * **Note:** The `number` type is not fully law abiding members of this class hierarchy due to the potential
   * for arithmetic overflows, and the presence of `NaN` and `Infinity` values. The behaviour is
   * unspecified in these cases.
   *
   * @since 2.0.0
   */
  /**
   * @since 2.0.0
   */
  export function getFunctionSemiring(S) {
      return {
          add: function (f, g) { return function (x) { return S.add(f(x), g(x)); }; },
          zero: function () { return S.zero; },
          mul: function (f, g) { return function (x) { return S.mul(f(x), g(x)); }; },
          one: function () { return S.one; }
      };
  }
  