docs: def star(self):
  		'''
  			If the present FSM accepts X, returns an FSM accepting X* (i.e. 0 or
  			more Xes). This is NOT as simple as naively connecting the final states
  			back to the initial state: see (b*ab)* for example.
  		'''
  		alphabet = self.alphabet
  
  		initial = {self.initial}
  
  		def follow(state, symbol):
  			next = set()
  			for substate in state:
  				if substate in self.map and symbol in self.map[substate]:
  					next.add(self.map[substate][symbol])
  
  				# If one of our substates is final, then we can also consider
  				# transitions from the initial state of the original FSM.
  				if substate in self.finals \
  				and self.initial in self.map \
  				and symbol in self.map[self.initial]:
  					next.add(self.map[self.initial][symbol])
  
  			if len(next) == 0:
  				raise OblivionError
  
  			return frozenset(next)
  
  		def final(state):
  			return any(substate in self.finals for substate in state)
  
  		return crawl(alphabet, initial, final, follow) | epsilon(alphabet)