Parse a stringiable into a list of words.

    Also returns the case type, which can be one of the following:
        - upper: All words are upper-case.
        - lower: All words are lower-case.
        - pascal: All words are title-case or upper-case. Note that the
                  stringiable may still have separators.
        - camel: First word is lower-case, the rest are title-case or
                 upper-case. stringiable may still have separators.
        - mixed: Any other mixing of word casing. Never occurs if there are
                 no separators.
        - unknown: stringiable contains no words.

    Also returns the first separator character, or False if there isn't one.

def parse_case(string, acronyms=None, preserve_case=False):
    """
    Parse a stringiable into a list of words.

    Also returns the case type, which can be one of the following:
        - upper: All words are upper-case.
        - lower: All words are lower-case.
        - pascal: All words are title-case or upper-case. Note that the
                  stringiable may still have separators.
        - camel: First word is lower-case, the rest are title-case or
                 upper-case. stringiable may still have separators.
        - mixed: Any other mixing of word casing. Never occurs if there are
                 no separators.
        - unknown: stringiable contains no words.

    Also returns the first separator character, or False if there isn't one.

    """
    words, separator, was_upper = _separate_words(string)

    if acronyms:
        # Use advanced acronym detection with list
        acronyms = _sanitize_acronyms(acronyms)
        check_acronym = _advanced_acronym_detection
    else:
        acronyms = []
        # Fallback to simple acronym detection.
        check_acronym = _simple_acronym_detection

    # Letter-run detector

    # Index of current word.
    i = 0
    # Index of first letter in run.
    s = None

    # Find runs of single upper-case letters.
    while i < len(words):
        word = words[i]
        if word is not None and UPPER.match(word):
            if s is None:
                s = i
        elif s is not None:
            i = check_acronym(s, i, words, acronyms) + 1
            s = None

        i += 1

    if s is not None:
        check_acronym(s, i, words, acronyms)

    # Separators are no longer needed, so they can be removed. They *should*
    # be removed, since it's supposed to be a *word* list.
    words = [w for w in words if w is not None]

    # Determine case type.
    case_type = _determine_case(was_upper, words, string)

    if preserve_case:
        if was_upper:
            words = [w.upper() for w in words]
    else:
        words = _normalize_words(words, acronyms)

    return words, case_type, separator