from typing import Any, Mapping, MutableMapping, Optional, Sequence
Key = Sequence
def get(nd: Optional[Mapping], keys: Key, default: Any = None) -> Any:
d: Any = nd
while d and keys:
d = d.get(keys[0])
keys = keys[1:]
if d is not None and d != {}:
return d
if default is not None:
return default
return d
def put(nd: MutableMapping, keys: Key, value: Any) -> None:
while True:
key = keys[0]
keys = keys[1:]
if not keys:
break
if key not in nd:
nd[key] = {}
nd = nd[key]
nd[key] = value
def store(nd: MutableMapping, keys: Key, value: Any, empty: Any, add) -> None:
while True:
key = keys[0]
keys = keys[1:]
if not keys:
break
if key not in nd:
nd[key] = {}
nd = nd[key]
if key not in nd:
nd[key] = empty
add(nd[key], value)
def update(nd: MutableMapping, src: Mapping) -> None:
for k, v in src.items():
if k not in nd or nd[k] is None:
nd[k] = v
elif isinstance(nd[k], dict) and isinstance(v, dict):
update(nd[k], v)
elif isinstance(nd[k], list):
if isinstance(v, list):
nd[k] += v
else:
nd[k].append(v)
elif type(nd[k]) is type(v):
nd[k] = v
else:
raise TypeError(f"type mismatch {k},{v} was {nd[k]}")