walker: drop path categories
[mdis.git] / src / mdis / walker.py
1 __all__ = [
2 "Walker",
3 "WalkerMeta",
4 ]
5
6 import enum
7 import dataclasses
8
9 from . import dispatcher
10
11
12 class WalkerMeta(dispatcher.DispatcherMeta):
13 pass
14
15
16 class Walker(dispatcher.Dispatcher, metaclass=WalkerMeta):
17 @dispatcher.Hook(tuple, list)
18 def dispatch_ordered_sequence(self, node):
19 for (index, item) in enumerate(node):
20 yield index
21 yield item
22
23 @dispatcher.Hook(set, frozenset)
24 def dispatch_unordered_sequence(self, node):
25 for item in node:
26 yield item
27
28 @dispatcher.Hook(dataclasses.is_dataclass)
29 def dispatch_dataclass(self, node):
30 for field in dataclasses.fields(node):
31 key = field.name
32 value = getattr(node, key)
33 yield key
34 yield value
35
36 @dispatcher.Hook(dict)
37 def dispatch_mapping(self, node):
38 for (key, value) in node.items():
39 yield key
40 yield value
41
42 @dispatcher.Hook(object)
43 def dispatch_object(self, node):
44 yield from ()