From 27298d175944407f685ea4ecc5096298407040ef Mon Sep 17 00:00:00 2001 From: h7x4 Date: Tue, 8 Apr 2025 12:33:13 +0200 Subject: [PATCH] collect: init --- flake.nix | 1 + src/collect.nix | 85 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 src/collect.nix diff --git a/flake.nix b/flake.nix index 34d58c0..ac9f9e4 100644 --- a/flake.nix +++ b/flake.nix @@ -17,5 +17,6 @@ overrideExisting = import ./src/overrideExisting.nix lib; findFirstIndex = import ./src/findFirstIndex.nix lib; filterAttrs = import ./src/filterAttrs.nix lib; + collect = import ./src/collect.nix lib; }; } diff --git a/src/collect.nix b/src/collect.nix new file mode 100644 index 0000000..3e22ba6 --- /dev/null +++ b/src/collect.nix @@ -0,0 +1,85 @@ +lib: +with lib; +let + collectOld = + pred: attrs: + if pred attrs then + [ attrs ] + else if isAttrs attrs then + concatMap (collect pred) (attrValues attrs) + else + [ ]; + + collectNew = + pred: attrs: + if pred attrs then [ attrs ] else + catAttrs "result" (genericClosure { + startSet = [{ key = ""; value = attrs; }]; + operator = item: + if item ? result + then [ ] + else if isAttrs item.value + # Note: this is an unwrapped mapAttrsToList + then map (k: { + key = "${item.key}/${k}"; + ${if pred item.value.${k} then "result" else "value"} = item.value.${k}; + }) (attrNames item.value) + else [ ]; + }); + + bigdata = { + g.f.n.o.b.r = { }; + g.d.s.b.t.x.g = true; + t.y.t.t.t.u.o.m.l.w.l.a.y.l = { }; + n.e.f.t.j.m = { }; + u.a.c.r.s = { }; + j.c.f.q.n.r.h.r.e.o.o.q.c = { }; + s.t.x.m.h.f.c.g.t.l.s.h.x = { }; + w.p.g.s.d.t = { }; + z.e.f.m.m.f.m.w.m.t.e = { }; + v.p.m.t.c.b.i.w.z.g.i.k.z.o = { }; + r.p.h = { }; + k.s.r.p.v.q.u.h.d.h.m.o.k = { }; + j.s.j.e.l.o.n.y.p.n.l.g.f.h = { }; + n.r.f.d.o.d.q.g.s.j.m.w.e.p = { }; + y.b.i.n.u = { }; + s.s.n.u.k.q.h = { }; + q.f.v.l.s.n.c.j.z.b.m.y.d = { }; + b.a.v = { }; + k.m.g.f = { }; + z.j.d.n.y.y.l.d.q.y.c.i.x = { }; + v.y.t.r.l.l.e.o.u.u.p.l.g.u = { }; + y.f.m.e.a.i.w = { }; + z.n.l = { }; + n.w.w = { }; + b.i.c.a.x.g.x.o.a.i.q = { }; + h.k.q.k.z.u.y.w = { }; + f.b.g.h.d.e.o.b = { }; + v.j.t.k.l.q.s = { }; + k.s.q.k.e.v.o.v.d.x.f.g.f = { }; + v.w.w.s.h.l.b.t.a.o.c.h.l = { }; + w.v.j.p = { }; + o.i.y.f.d.j = { }; + d.f.m.p.i.p.a.u.d.m.c.b.i.m = { }; + n.r.g.e.b.n.g.d = { }; + d.g.a.v.w.i.r.v.g.q.r.h.p.i = { }; + s.j.e.t.r.n.a = { }; + h.s.b = { }; + d.f.l.v.w = { }; + s.b.x = { }; + l.j.k.y.j.f.x.f.y = { }; + z.n.t.t.b.f.e.z.r.k.x.o.z.s = { }; + p.d.j.b.p.k.t.x = { }; + e.d.m.s.y.e.r.y.n = { }; + u.r.v.j.r.z.o.h.h.i.k = { }; + h.y.i.e.t.i.i.t = { }; + y.y.f.h.o.t.d.j.s.s.e.q = { }; + m.l.j.z.a.g.c.t.x = { }; + p.o.z.s.m.e.u.c.x = { }; + i.s.e.y = { }; + d.f.u.j.c.x.v.e.x.w.p.m.g = { }; + }; +in { + old = collectOld (x: x ? a) bigdata; + new = collectNew (x: x ? a) bigdata; +}