Process a state and return the next state
Usage:

    out = rule_110.process([True, False, True])
    len(out)  # 5, because a False is added to either side
    out == [True, True, True, True, False]
    out = rule_110.process([False, True, False, True])
    len(out)  # still 5, because leading / trailing False's are removed
    out2 = rule_110.process([1, 0, 1])  # Any data type in the list is okay, as
                                        # long as it's boolean value is correct
    out == out2

def process(self, state):
        """Process a state and return the next state
Usage:

    out = rule_110.process([True, False, True])
    len(out)  # 5, because a False is added to either side
    out == [True, True, True, True, False]
    out = rule_110.process([False, True, False, True])
    len(out)  # still 5, because leading / trailing False's are removed
    out2 = rule_110.process([1, 0, 1])  # Any data type in the list is okay, as
                                        # long as it's boolean value is correct
    out == out2
"""
        if not isinstance(state, list):
            raise TypeError("state must be list")
        if self.finite_canvas:
            state = _crop_list_to_size(state, self.canvas_size)
        else:
            state = _remove_lead_trail_false(state)
            state.insert(0, self.default_val)
            state.append(self.default_val)
        new_state = []
        for i in range(0, len(state)):
            result = _process_cell(i, state, finite=self.finite_canvas)
            new_state.append(self.rules[result])
        return new_state