from typing import List, Callable, Any
from .derivation import Derivation
from .graph import Graph
import molfoundry.rule as rule
from .core import TSObject
_class_ref_DGStrat = TSObject.get_class_ref("DGStrat")
_class_ref_GraphState = TSObject.get_class_ref("GraphState")
# noinspection PyPep8Naming
[docs]
class DGStrat(TSObject):
# Injectable dgStrat util
_dg_strat: Callable[[Any], "DGStrat"]
def __init__(self) -> None:
super().__init__(_class_ref_DGStrat)
[docs]
@staticmethod
def makeAddStatic(onlyUniverse: bool, graphs: List[Graph]) -> "DGStrat":
return DGStrat.wrap(
TSObject.call_static(_class_ref_DGStrat, "makeAddStatic", onlyUniverse, [g._ref for g in graphs]))
[docs]
@staticmethod
def makeAddDynamic(onlyUniverse: bool, graphsFunc: Callable[[], List[Graph]]) -> "DGStrat":
return DGStrat.wrap(TSObject.call_static(_class_ref_DGStrat, "makeAddDynamic", onlyUniverse,
lambda: [g._ref for g in graphsFunc()]))
[docs]
@staticmethod
def makeSequence(strats: List["DGStrat"]) -> "DGStrat":
return DGStrat.wrap(TSObject.call_static(_class_ref_DGStrat, "makeSequence", [s._ref for s in strats]))
[docs]
@staticmethod
def makeParallel(strats: List["DGStrat"]) -> "DGStrat":
return DGStrat.wrap(TSObject.call_static(_class_ref_DGStrat, "makeParallel", [s._ref for s in strats]))
[docs]
@staticmethod
def makeFilter(alsoUniverse: bool, p: Callable[[Graph, "GraphState", bool], bool]) -> "DGStrat":
return DGStrat.wrap(TSObject.call_static(_class_ref_DGStrat, "makeFilter", alsoUniverse,
lambda g, s, f: p(Graph.wrap(g), GraphState.wrap(s), f)))
[docs]
@staticmethod
def makeExecute(func: Callable[["GraphState"], None]) -> "DGStrat":
return DGStrat.wrap(TSObject.call_static(_class_ref_DGStrat, "makeExecute", lambda s: func(GraphState.wrap(s))))
[docs]
@staticmethod
def makeRule(r: "rule.Rule") -> "DGStrat":
return DGStrat.wrap(TSObject.call_static(_class_ref_DGStrat, "makeRule", r._ref))
[docs]
@staticmethod
def makeLeftPredicate(p: Callable[[Derivation], bool], strat: "DGStrat") -> "DGStrat":
return DGStrat.wrap(TSObject.call_static(_class_ref_DGStrat, "makeLeftPredicate",
lambda d: p(Derivation.wrap(d)), strat._ref))
[docs]
@staticmethod
def makeRightPredicate(p: Callable[[Derivation], bool], strat: "DGStrat") -> "DGStrat":
return DGStrat.wrap(TSObject.call_static(_class_ref_DGStrat, "makeRightPredicate",
lambda d: p(Derivation.wrap(d)), strat._ref))
[docs]
@staticmethod
def makeRevive(strat: "DGStrat") -> "DGStrat":
return DGStrat.wrap(TSObject.call_static(_class_ref_DGStrat, "makeRevive", strat._ref))
[docs]
@staticmethod
def makeRepeat(limit: int, strat: "DGStrat") -> "DGStrat":
return DGStrat.wrap(TSObject.call_static(_class_ref_DGStrat, "makeRepeat", limit, strat._ref))
def __rshift__(self, other) -> "DGStrat":
return DGStrat.makeSequence([DGStrat._dg_strat(self), DGStrat._dg_strat(other)])
def __rrshift__(self, other) -> "DGStrat":
return DGStrat.makeSequence([DGStrat._dg_strat(other), DGStrat._dg_strat(self)])
[docs]
class GraphState(TSObject):
def __init__(self) -> None:
super().__init__(_class_ref_GraphState)
@property
def universe(self) -> List[Graph]:
return [Graph.wrap(g) for g in self._ref.getUniverse()]
@property
def subset(self) -> List[Graph]:
return [Graph.wrap(g) for g in self._ref.getSubset()]