From 6bb99b45c3291767ceb9d683f37a22f7e5696f9c Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Wed, 18 Aug 2021 14:04:00 -0400 Subject: [PATCH] fold.py --- implementations/python/preserves/__init__.py | 2 ++ implementations/python/preserves/fold.py | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 implementations/python/preserves/fold.py diff --git a/implementations/python/preserves/__init__.py b/implementations/python/preserves/__init__.py index 9a1f59b..393e2b9 100644 --- a/implementations/python/preserves/__init__.py +++ b/implementations/python/preserves/__init__.py @@ -6,5 +6,7 @@ from .error import DecodeError, EncodeError, ShortPacket from .binary import Decoder, Encoder, decode, decode_with_annotations, encode from .text import Parser, Formatter, parse, parse_with_annotations, stringify +from . import fold + loads = parse dumps = stringify diff --git a/implementations/python/preserves/fold.py b/implementations/python/preserves/fold.py new file mode 100644 index 0000000..90b1e43 --- /dev/null +++ b/implementations/python/preserves/fold.py @@ -0,0 +1,17 @@ +from .values import ImmutableDict, dict_kvs, Embedded, Record + +def map_embeddeds(f, v): + def walk(v): + if isinstance(v, Embedded): + return f(v.embeddedValue) + elif isinstance(v, (list, tuple)): + return tuple(walk(w) for w in v) + elif isinstance(v, (set, frozenset)): + return frozenset(walk(w) for w in v) + elif isinstance(v, dict): + return ImmutableDict.from_kvs(walk(w) for w in dict_kvs(v)) + elif isinstance(v, Record): + return Record(walk(v.key), walk(v.fields)) + else: + return v + return walk(v)