def get_construct_name(words):
    """
    Find the construct name, currently works for:
    - AsyncFunctionDef
    - FunctionDef
    - ClassDef

    :param words: Tuple of words (no whitespace)
    :type words: ```Tuple[str]```

    :return: Name of construct if found else None
    :rtype: ```Optional[str]```
    """
    for idx, word in enumerate(words):
        if len(words) > idx + 1:
            if word == "def":
                return words[idx + 1][: words[idx + 1].find("(")]
            elif word == "class":
                end_idx = (
                    lambda _end_idx: words[idx + 1].find(":")
                    if _end_idx == -1
                    else _end_idx
                )(words[idx + 1].find("("))
                return words[idx + 1][:end_idx]