test_cases = [[True], [False],
              [True, False],
              [True, False, False],
              [True, True, True, False],
              [False, True],
              [True, False, True]]

expected_output = [True, True, True, True, True, False, False]


def check0(x):
    n_trues = sum(x)
    should_be_true = x[:n_trues]  # get the first n items
    should_be_false = x[n_trues:len(x)]  # get the remaining items
    # return True only if all of the first n elements are True and the remaining
    # elements are all False
    return all(should_be_true) and all([not element for element in should_be_false])


def check1a(x):
    status = list(k for k, g in groupby(x))
    return len(status) <= 2 and (status[0] is True or status[-1] is False)


def check1b(x):
    status = list(k for k, g in groupby(map(book, x)))
    return status and len(status) <= 2 and (status[0] or not status[-1])


def check1c(x):
    status = list(k for k, g in groupby(map(book, x)))
    return not status or (len(status) <= 2 and (status[0] or not status[-1]))


def check2(x):
    iterator = iter(x)
    # process the true elements
    all(iterator)
    # check that there are no true elements left
    return not any(iterator)


assert list(map(check0, test_cases)) == expected_output
assert list(map(check1a, test_cases)) == expected_output
assert list(map(check1b, test_cases)) == expected_output
assert list(map(check1c, test_cases)) == expected_output
assert list(map(check2, test_cases)) == expected_output