aboutsummaryrefslogtreecommitdiffstats
path: root/bsie/matcher/matcher.py
diff options
context:
space:
mode:
Diffstat (limited to 'bsie/matcher/matcher.py')
-rw-r--r--bsie/matcher/matcher.py61
1 files changed, 61 insertions, 0 deletions
diff --git a/bsie/matcher/matcher.py b/bsie/matcher/matcher.py
new file mode 100644
index 0000000..a89626f
--- /dev/null
+++ b/bsie/matcher/matcher.py
@@ -0,0 +1,61 @@
+
+# standard imports
+import abc
+import typing
+
+# bsie imports
+from bsie.utils import bsfs
+
+# inner-module imports
+from . import nodes
+
+# exports
+__all__: typing.Sequence[str] = (
+ 'Matcher',
+ )
+
+
+## code ##
+
+class Matcher():
+ """Determine node uri's from node hints."""
+ def __call__(
+ self,
+ iterable: typing.Iterable[typing.Tuple[nodes.Node, bsfs.URI, typing.Any]],
+ ):
+ """Apply the matcher on a triple iterator."""
+ return MatcherIterator(self, iterable)
+
+ @abc.abstractmethod
+ def match_node(self, node: nodes.Node) -> nodes.Node:
+ """Apply the matcher on a node."""
+
+
+class MatcherIterator():
+ """Iterates over triples, determines uris according to a *matcher* as it goes."""
+
+ # source triple iterator.
+ _iterable: typing.Iterable[typing.Tuple[nodes.Node, bsfs.URI, typing.Any]]
+
+ # node matcher
+ _matcher: Matcher
+
+ def __init__(
+ self,
+ matcher: Matcher,
+ iterable: typing.Iterable[typing.Tuple[nodes.Node, bsfs.URI, typing.Any]],
+ ):
+ self._iterable = iterable
+ self._matcher = matcher
+
+ def __iter__(self):
+ for node, pred, value in self._iterable:
+ # handle subject
+ self._matcher.match_node(node)
+ # handle value
+ if isinstance(value, nodes.Node):
+ self._matcher.match_node(value)
+ # yield triple
+ yield node, pred, value
+
+## EOF ##