blob: c15c86e5f81d9de6943e059cc80654ad36cdf570 [file] [log] [blame]
from pywy.types import T
from typing import Iterable, Dict, Callable, List, Any, Generic
class GraphNode(Generic[T]):
current: T
visited: bool
def __init__(self, op: T):
self.current = op
self.visited = False
def getadjacents(self) -> Iterable[T]:
pass
def build_node(self, t:T) -> 'GraphNode[T]':
pass
def adjacents(self, created: Dict[T, 'GraphNode[T]']) -> Iterable['GraphNode[T]']:
adjacent = self.getadjacents()
if len(adjacent) == 0:
return []
def wrap(op:T):
if op is None:
return None
if op not in created:
created[op] = self.build_node(op)
return created[op]
return map(wrap, adjacent)
def visit(self, parent: 'GraphNode[T]', udf: Callable[['GraphNode[T]', 'GraphNode[T]'], Any], visit_status: bool = True):
if(self.visited == visit_status):
return
self.visited = visit_status
return udf(self, parent)
class WayangGraph(Generic[T]):
starting_nodes : List[GraphNode[T]]
created_nodes : Dict[T, GraphNode[T]]
def __init__(self, nodes: List[T]):
self.created_nodes = {}
self.starting_nodes = list()
for node in nodes:
tmp = self.build_node(node)
self.starting_nodes.append(tmp)
self.created_nodes[node] = tmp
def build_node(self, t:T) -> GraphNode[T]:
pass
def traversal(
self,
origin: GraphNode[T],
nodes: Iterable[GraphNode[T]],
udf: Callable[['GraphNode[T]', 'GraphNode[T]'], Any]
):
for node in nodes:
adjacents = node.adjacents(self.created_nodes)
self.traversal(node, adjacents, udf)
node.visit(origin, udf)