Skip to content

Instantly share code, notes, and snippets.

@mebubo
Last active March 29, 2019 08:04
Show Gist options
  • Select an option

  • Save mebubo/5e482cda0d148e8c5ddc1aa1767acaa5 to your computer and use it in GitHub Desktop.

Select an option

Save mebubo/5e482cda0d148e8c5ddc1aa1767acaa5 to your computer and use it in GitHub Desktop.
j = {
'a': 1,
'b': {
'a': 2,
'c': "toto",
'd': [1, 2, 3],
'e': {
'd': "hello",
'x': [{'1': 2}]
}
}
}
def mergeKeys(k1, k2):
return "%s.%s" % (k1, k2)
def fmapJ(f, d):
if isinstance(d, list):
return [f(x) for x in d]
if isinstance(d, dict):
return {k: f(v) for (k, v) in d.items()}
return d
# https://compiletoi.net/garcon-theres-a-catamorphism-in-my-python/
def cata(f, d, fmap):
return f(fmap(lambda x: cata(f, x, fmap), d))
def merge(k, v):
if isinstance(v, dict):
return [(mergeKeys(k, k2), v2) for (k2, v2) in flatten(v).items()]
else:
return [(k, v)]
def merge1(k, v):
if isinstance(v, dict):
return [(mergeKeys(k, k2), v2) for (k2, v2) in v.items()]
else:
return [(k, v)]
def flattenM(d, m):
if isinstance(d, dict):
return {k2: v2 for (k, v) in d.items() for (k2, v2) in m(k, v)}
return d
def flatten(d):
return flattenM(d, merge)
def flatten1(d):
return flattenM(d, merge1)
def flattenC(d):
return cata(flatten1, d, fmapJ)
def mapKeys1(d, f):
if isinstance(d, dict):
return {f(k): v for (k, v) in d.items()}
return d
def mapKeysC(d, f):
return cata(lambda x: mapKeys1(x, f), d, fmapJ)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment