collect: init

This commit is contained in:
2025-04-08 12:33:13 +02:00
parent 631e545b57
commit 27298d1759
2 changed files with 86 additions and 0 deletions

View File

@@ -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;
};
}

85
src/collect.nix Normal file
View File

@@ -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 = "<root>"; 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;
}