PK!Aeecarve/__init__.py__version__ = "0.1.0" from .carve import treemap, mapkey, mapval, remove, on_key, remove_empty, flow PK!77<<carve/carve.py# todo: # add table / proof / fuzzy testing incl. benchmarks # add docs # add helper functions as premade lambda funcs (test for nulls, etc) # showcase composing a mapper func from cytoolz import itemmap, map, keyfilter, identity, reduce def xform(key, tree, mapfn, path): if not key: return tree (xkey, xtree) = mapfn(key, tree, path) if key: return (xkey, xtree) return xtree def on_key(key, f): return lambda k, v, p: f(k, v, p) if (key in p) else (k, v) def remove_empty(k, v, p): return (None, None) if not v else (k, v) def mapkey(f): return lambda k, v, p: (f(k, v, p), v) def mapval(f): return lambda k, v, p: (k, f(k, v, p)) def remove(f): return lambda k, v, p: (None, None) if f(k, v, p) else (k, v) def flow(*args): return lambda k, v, p: reduce( lambda tup, f: (*f(tup[0], tup[1], tup[2]), tup[2]), args, (k, v, p) )[0:2] def treemap(tree, mapfn, key=None, path=()): res = tree if isinstance(tree, dict): res = keyfilter( identity, itemmap( lambda item: treemap(item[1], mapfn, item[0], path + (item[0],)), tree ), ) elif isinstance(tree, list): res = list(map(lambda t: treemap(t, mapfn, None, path), tree)) return xform(key, res, mapfn, path) PK!M={{carve/curried.pyfrom .carve import treemap as _treemap_noncurried def treemap(fn): return lambda tree: _treemap_noncurried(tree, fn) PK!H WXcarve-0.1.0.dist-info/WHEEL A н#Z."jm)Afb~ڠO68oF04UhoAf f4=4h0k::wXPK!HRcarve-0.1.0.dist-info/METADATAMK1 9*8~,qQsȴ~,CoɛI=&l(DN\D4t$~JΤZ q-5oh ޴wϭXqG.~S KAl,ջ~rM@kX3],qS5دAqXmU Q-P.{zJ ;gJKwR }PK!H!+#carve-0.1.0.dist-info/RECORDu̹@op*Ups x ~7&66|YŔRvf=|3Lge4Hhc!"܇|_yԗPdr:,Y7:;1JIӓWC0Gږ[dGNP;m,ăiJEFCi5fC>g]ϱ2Wۯ5b_/PzyT޸`skE3e}h`% |hhmwc)56\H+pem^I- `PK!Aeecarve/__init__.pyPK!77<<carve/carve.pyPK!M={{carve/curried.pyPK!H WXcarve-0.1.0.dist-info/WHEELPK!HR5carve-0.1.0.dist-info/METADATAPK!H!+#Vcarve-0.1.0.dist-info/RECORDPK