Generator expression.  Yields tuples of `(begin, length, value)`,
        where:

        - `begin` is an integer identifying the character index where
          the match begins (0-based)
        - `length` is an integer indicating the length of the match (1
          or more characters)
        - `value` is the value of the matching node in the trie

def find_all(self, seq):
        '''
        Generator expression.  Yields tuples of `(begin, length, value)`,
        where:

        - `begin` is an integer identifying the character index where
          the match begins (0-based)
        - `length` is an integer indicating the length of the match (1
          or more characters)
        - `value` is the value of the matching node in the trie
        '''
        if not self._suffix_links_set:
            self._set_suffix_links()
        current = self.root
        for pos, char in enumerate(seq):
            # find a state where we can transition on char
            while char not in current and current.has_suffix:
                current = current.suffix
            if char in current:
                # transition
                current = current[char]
            else:
                # we must be at the root node
                assert current is self.root
                # throw out the char without doing anything
                # pass
            # now perform any matching on the current node
            if current.has_value:
                yield (1 + pos - current.depth, current.depth, current.value)
            dict_suffix = current
            while dict_suffix.has_dict_suffix:
                dict_suffix = dict_suffix.dict_suffix
                yield (1 + pos - dict_suffix.depth, dict_suffix.depth, dict_suffix.value)