diff --git a/lib/Bastion/Common.py b/lib/Bastion/Common.py index ffef0b0..b493ce9 100644 --- a/lib/Bastion/Common.py +++ b/lib/Bastion/Common.py @@ -12,6 +12,13 @@ import pathlib import logging import urllib +from functools import singledispatch +from types import MappingProxyType + +try: + from frozendict import frozendict +except ImportError: + frozendict = lambda d: MappingProxyType(d) from typing import Any, FrozenSet @@ -487,3 +494,26 @@ def asInteger(x): def asNumeric(x): return float(x) + +@singledispatch +def freeze(obj): + """ + An outer function that takes a generic object and attempts to build an immutable version of the given object. + """ + return obj # default: assume immutable + +@freeze.register +def _(obj: dict): + return frozendict({freeze(k): freeze(v) for k, v in obj.items()}) + +@freeze.register +def _(obj: list): + return tuple(freeze(i) for i in obj) + +@freeze.register +def _(obj: set): + return frozenset(freeze(i) for i in obj) + +@freeze.register +def _(obj: tuple): + return tuple(freeze(i) for i in obj)