Returns a generator that produces (x, y) tuples for a square.
    This function is an alias for the rectangle() function, with `length` passed for both the
    `width` and `height` parameters.

    The `left` and `top` arguments are the x and y coordinates for the topleft corner of the square.

    If `filled` is `True`, the interior points are also returned.

    NOTE: The `thickness` argument is not yet implemented.

    >>> list(square(0, 0, 5))
    [(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (3, 4), (2, 4), (1, 4), (0, 4), (0, 3), (0, 2), (0, 1)]
    >>> drawPoints(square(0, 0, 5))
    OOOOO
    O,,,O
    O,,,O
    O,,,O
    OOOOO
    >>> drawPoints(square(0, 0, 5, filled=True))
    OOOOO
    OOOOO
    OOOOO
    OOOOO
    OOOOO

def square(left, top, length, filled=False, thickness=1):
    """Returns a generator that produces (x, y) tuples for a square.
    This function is an alias for the rectangle() function, with `length` passed for both the
    `width` and `height` parameters.

    The `left` and `top` arguments are the x and y coordinates for the topleft corner of the square.

    If `filled` is `True`, the interior points are also returned.

    NOTE: The `thickness` argument is not yet implemented.

    >>> list(square(0, 0, 5))
    [(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (3, 4), (2, 4), (1, 4), (0, 4), (0, 3), (0, 2), (0, 1)]
    >>> drawPoints(square(0, 0, 5))
    OOOOO
    O,,,O
    O,,,O
    O,,,O
    OOOOO
    >>> drawPoints(square(0, 0, 5, filled=True))
    OOOOO
    OOOOO
    OOOOO
    OOOOO
    OOOOO
    """
    if thickness != 1:
        raise NotImplementedError('The pybresenham module is under development and the filled, thickness, and endcap parameters are not implemented. You can contribute at https://github.com/asweigart/pybresenham')

    return rectangle(left, top, length, length, filled, thickness)