from sort_list import sort_list
from typing import Any

def dichotomie(liste: list[Any], element: Any, start: int = 0, end: int = None, bypass_sorting: bool = False) -> bool:
    """Performs a dichotomy search to determine if an element exists in a list or not.

    Args:
        liste (list[Any]): The list in which to search for the element.
        element (Any): The element to search for.
        start (int, optional): The starting index of the sublist to search. Defaults to 0.
        end (int, optional): The ending index of the sublist to search. Defaults to None.
        bypass_sorting (bool, optional): If True, skips sorting the list. Defaults to False.

    Returns:
        bool: True if the element is found, False otherwise.
    """
    if not liste:
        return False

    assert isinstance(element, type(liste[0])), "Wrong type between liste and element"

    if not bypass_sorting:
        liste = sort_list(liste)

    if end is None:
        end = len(liste) - 1

    if start > end:
        return False

    middle = (start + end) // 2

    if liste[middle] == element:
        return True
    elif element < liste[middle]:
        return dichotomie(liste, element, start, middle - 1, bypass_sorting=True) # bypass_sorting because it's already done
    else:
        return dichotomie(liste, element, middle + 1, end, bypass_sorting=True) # bypass_sorting because it's already done
