core/lib/utils/accumulate.nix

57 lines
1.1 KiB
Nix
Raw Normal View History

2025-08-05 14:55:13 +02:00
{l}: let
unique =
l.foldl' (
acc: e:
if l.elem e.name acc.visited
then acc
else {
visited = acc.visited ++ [e.name];
result = acc.result ++ [e];
}
) {
visited = [];
result = [];
};
accumulate =
l.foldl' (
acc: new: let
first = l.head new;
cdr = l.tail new;
second = l.head cdr;
cdr' = l.tail cdr;
third = l.head cdr';
in
(
if first == null
then {inherit (acc) output;}
else {output = acc.output // first;}
)
// (
if second == null
then {inherit (acc) actions;}
else {actions = acc.actions // second;}
)
// (
if third == null
then {inherit (acc) init;}
else {init = acc.init ++ [third];}
)
) {
output = {};
actions = {};
init = [];
};
optionalLoad = cond: elem:
if cond
then elem
else [
null # empty output
null # empty action
null # empty init
];
in {
inherit unique accumulate optionalLoad;
}