def parallel(fsms, test):
	'''
		Crawl several FSMs in parallel, mapping the states of a larger meta-FSM.
		To determine whether a state in the larger FSM is final, pass all of the
		finality statuses (e.g. [True, False, False] to `test`.
	'''
	alphabet = set().union(*[fsm.alphabet for fsm in fsms])

	initial = dict([(i, fsm.initial) for (i, fsm) in enumerate(fsms)])

	# dedicated function accepts a "superset" and returns the next "superset"
	# obtained by following this transition in the new FSM
	def follow(current, symbol):
		next = {}
		for i in range(len(fsms)):
			if symbol not in fsms[i].alphabet and anything_else in fsms[i].alphabet:
				actual_symbol = anything_else
			else:
				actual_symbol = symbol
			if i in current \
			and current[i] in fsms[i].map \
			and actual_symbol in fsms[i].map[current[i]]:
				next[i] = fsms[i].map[current[i]][actual_symbol]
		if len(next.keys()) == 0:
			raise OblivionError
		return next

	# Determine the "is final?" condition of each substate, then pass it to the
	# test to determine finality of the overall FSM.
	def final(state):
		accepts = [i in state and state[i] in fsm.finals for (i, fsm) in enumerate(fsms)]
		return test(accepts)

	return crawl(alphabet, initial, final, follow).reduce()
Crawl several FSMs in parallel, mapping the states of a larger meta-FSM.
		To determine whether a state in the larger FSM is final, pass all of the
		finality statuses (e.g. [True, False, False] to `test`.