def half_area(ia, max_bound=0, tol=0.5):
    """
	Find bound of peak by summing intensities until change in sum is less than
	'tol' percent of the current area.

	:param ia: List of intensities from Peak apex for a given mass
	:type ia: list
	:param max_bound: Optional value to limit size of detected bound, default 0
	:type max_bound: int, optional
	:param tol: Percentage tolerance of added area to current area, default 0.5
	:type tol: float, optional

	:return: Half peak area, boundary offset, shared (True if shared ion)
	:rtype: tuple

	:authors: Andrew Isaac, Dominic Davis-Foster (type assertions)
	"""
    if not isinstance(ia, list) or not isinstance(ia[0], (int, float)):
        raise TypeError("'ia' must be a list of numbers")
    if not isinstance(max_bound, int):
        raise TypeError("'max_bound' must be an integer")
    if not isinstance(tol, float):
        raise TypeError("'tol' must be a float")
    tol = tol / 200.0
    wide = 3
    shared = False
    area = ia[0]
    edge = float(sum(ia[0:wide])) / wide
    old_edge = 2 * edge
    index = 1
    if max_bound < 1:
        limit = len(ia)
    else:
        limit = min(max_bound + 1, len(ia))
    while area * tol < edge < old_edge and index < limit:
        old_edge = edge
        area += ia[index]
        edge = float(sum(ia[index:index + wide])) / wide
        index += 1
    if edge >= old_edge:
        shared = True
    index -= 1
    return area, index, shared
