123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- from state.base import INTEGER, FLOAT, BOOLEAN, STRING, TYPE, State
- from core.element import Element, String
- class Bottom:
- def __init__(self, state: State):
- self.state = state
- def create_model(self, name: String) -> Element:
- bottom = self.state.create_nodevalue(name.value)
- self.state.create_dict(bottom, "Model", self.state.create_node())
- return Element(id=bottom)
- def add_node(self, model: Element, name: String):
- model_root = self.state.read_dict(model.id, "Model")
- # create model element
- element = self.state.create_node()
- # connect to model root
- self.state.create_dict(model_root, name.value, element)
- # confirm that element has been added to the model
- element = self.state.read_dict(model_root, name.value)
- if element is None:
- self.state.delete_node(element)
- print(f"Warning: Invalid name {name.value}, element not created.")
- return
- def add_value(self, model: Element, name: String, value: Element):
- model_root = self.state.read_dict(model.id, "Model")
- # create model element
- element = self.state.create_nodevalue(value.value)
- if element is None:
- print("Warning: Invalid value, value node not created.")
- return
- # connect to model root
- self.state.create_dict(model_root, name.value, element)
- # confirm that element has been added to the model
- element_found = self.state.read_dict(model_root, name.value)
- if element_found is None:
- self.state.delete_node(element)
- print(f"Warning: Invalid name {name.value}, element not created.")
- return
- def add_edge(self, model: Element, name: String, source: String, target: String):
- model_root = self.state.read_dict(model.id, "Model")
- source_element = self.state.read_dict(model_root, source.value)
- if source_element is None:
- print(f"Warning: Unknown source element {source.value}, edge not created.")
- return
- target_element = self.state.read_dict(model_root, target.value)
- if target_element is None:
- print(f"Warning: Unknown target element {target.value}, edge not created.")
- return
- # create model element
- element = self.state.create_edge(source_element, target_element)
- # connect to model root
- self.state.create_dict(model_root, name.value, element)
- # confirm that element has been added to the model
- element = self.state.read_dict(model_root, name.value)
- if element is None:
- self.state.delete_edge(element)
- print(f"Warning: Invalid name {name.value}, element not created.")
- def delete_element(self, model: Element, name: String):
- model_root = self.state.read_dict(model.id, "Model")
- element = self.state.read_dict(model_root, name.value)
- # could be both a node or an edge
- self.state.delete_node(element)
- self.state.delete_edge(element)
- def list_elements(self, model: Element):
- def is_edge(elem: Element) -> bool:
- edge = self.state.read_edge(elem.id)
- return edge is not None
- def value_type(value) -> str:
- map = {
- int: INTEGER,
- float: FLOAT,
- str: STRING,
- bool: BOOLEAN,
- tuple: TYPE
- }
- return map[type(value)][0]
-
- unsorted = []
- model_root = self.state.read_dict(model.id, "Model")
- for elem_edge in self.state.read_outgoing(model_root):
- # get element name
- label_edge, = self.state.read_outgoing(elem_edge)
- _, label_node = self.state.read_edge(label_edge)
- label = self.state.read_value(label_node)
- # find element bottom type
- _, elem = self.state.read_edge(elem_edge)
- if is_edge(elem):
- bottom_type = "Edge"
- else:
- # is_node
- elem_value = self.state.read_value(elem)
- if elem_value is None:
- bottom_type = "Node"
- else:
- bottom_type = value_type
- unsorted.append(f"{label} : {bottom_type}")
- for i in sorted(unsorted):
- print(i)
|