Finds all possible two letter edits of word_string:
    - Splitting word_string into two words at all character locations
    - Deleting one letter at all character locations
    - Switching neighbouring characters
    - Replacing a character with every alphabetical letter
    - Inserting all possible alphabetical characters between each character location including boundaries

    This can be seen as a reapplication of find_one_letter_edits to all words found via a first
    instantiation of find_one_letter_edits on word_string.

    Returns all two letter edits as a set instance.

def find_two_letter_edits(word_string):
    '''
    Finds all possible two letter edits of word_string:
    - Splitting word_string into two words at all character locations
    - Deleting one letter at all character locations
    - Switching neighbouring characters
    - Replacing a character with every alphabetical letter
    - Inserting all possible alphabetical characters between each character location including boundaries

    This can be seen as a reapplication of find_one_letter_edits to all words found via a first
    instantiation of find_one_letter_edits on word_string.

    Returns all two letter edits as a set instance.
    '''
    if word_string is None:
        return {}
    elif isinstance(word_string, str):
        return (e2 for e1 in find_one_letter_edits(word_string) for e2 in find_one_letter_edits(e1))
    else:
        raise InputError("string or none type variable not passed as argument to find_two_letter_edits")