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