<!-- Generated with Stardoc: http://skydoc.bazel.build -->

<a name="#my_namespace.min"></a>

## my_namespace.min

<pre>
my_namespace.min(<a href="#my_namespace.min-integers">integers</a>)
</pre>

Returns the minimum of given elements.

### Returns

The minimum integer in the given list.

### Parameters

<table class="params-table">
  <colgroup>
    <col class="col-param" />
    <col class="col-description" />
  </colgroup>
  <tbody>
    <tr id="my_namespace.min-integers">
      <td><code>integers</code></td>
      <td>
        required.
        <p>
          A list of integers. Must not be empty.
        </p>
      </td>
    </tr>
  </tbody>
</table>


<a name="#my_namespace.math.min"></a>

## my_namespace.math.min

<pre>
my_namespace.math.min(<a href="#my_namespace.math.min-integers">integers</a>)
</pre>

Returns the minimum of given elements.

### Returns

The minimum integer in the given list.

### Parameters

<table class="params-table">
  <colgroup>
    <col class="col-param" />
    <col class="col-description" />
  </colgroup>
  <tbody>
    <tr id="my_namespace.math.min-integers">
      <td><code>integers</code></td>
      <td>
        required.
        <p>
          A list of integers. Must not be empty.
        </p>
      </td>
    </tr>
  </tbody>
</table>


<a name="#my_namespace.foo.bar.baz"></a>

## my_namespace.foo.bar.baz

<pre>
my_namespace.foo.bar.baz()
</pre>

This function does nothing.



<a name="#my_namespace.one.two.min"></a>

## my_namespace.one.two.min

<pre>
my_namespace.one.two.min(<a href="#my_namespace.one.two.min-integers">integers</a>)
</pre>

Returns the minimum of given elements.

### Returns

The minimum integer in the given list.

### Parameters

<table class="params-table">
  <colgroup>
    <col class="col-param" />
    <col class="col-description" />
  </colgroup>
  <tbody>
    <tr id="my_namespace.one.two.min-integers">
      <td><code>integers</code></td>
      <td>
        required.
        <p>
          A list of integers. Must not be empty.
        </p>
      </td>
    </tr>
  </tbody>
</table>


<a name="#my_namespace.one.three.does_nothing"></a>

## my_namespace.one.three.does_nothing

<pre>
my_namespace.one.three.does_nothing()
</pre>

This function does nothing.



