class DFS:
def __init__(self, dep_func, dep_args):
self._ordering = []
self._seen_nodes = {}
self._dep_func = dep_func
self._dep_args = dep_args
return
def _node_seen(self, node, others):
self._stack.pop()
if self._seen_nodes[node] == 0:
self._ordering.append(node)
self._seen_nodes[node] = 1
if len(others) > 0:
self._stack.append((others[0], others[1:]))
return
def search(self, node):
self._stack = stack = [(node, [])]
while len(stack):
node, others = stack[-1]
if self._seen_nodes.has_key(node):
self._node_seen(node, others)
continue
self._seen_nodes[node] = 0
deps = self._dep_func(node, self._dep_args)
if len(deps) > 0:
stack.append((deps[0], deps[1:]))
continue
self._node_seen(node, others)
return
def result(self):
return self._ordering
syntax highlighted by Code2HTML, v. 0.9.1