add lib.lists.groupByMult
parent
ea7a167bf9
commit
07c9126aa9
@ -0,0 +1,42 @@
|
||||
{ lib, ... }@flakeArg:
|
||||
let
|
||||
inherit (builtins)
|
||||
deepSeq
|
||||
foldl'
|
||||
groupBy
|
||||
mapAttrs
|
||||
;
|
||||
inherit (lib.lists) singleton;
|
||||
inherit (lib.trivial) flip pipe;
|
||||
in
|
||||
{
|
||||
|
||||
groupByMult =
|
||||
groupers:
|
||||
# TODO (maybe) make more efficient by building up grouping function from right
|
||||
# from left
|
||||
# 0= (x: x) vals
|
||||
# 1= groupBy values[0] <0>
|
||||
# 2= mapAttrs (_: groupBy values[1]) <1>
|
||||
# 3= mapAttrs (_: mapAttrs (_: groupBy values[2])) <2>
|
||||
# from right
|
||||
# 1= (groupBy values[0])
|
||||
# 2= ...
|
||||
let
|
||||
nul = {
|
||||
mapper = x: x;
|
||||
result = [ ];
|
||||
};
|
||||
op =
|
||||
{ mapper, result }:
|
||||
grouper: {
|
||||
mapper = fun: mapAttrs (_: mapper fun);
|
||||
result = result ++ singleton (mapper grouper);
|
||||
};
|
||||
list = map groupBy groupers;
|
||||
pipeList = (foldl' op nul list).result;
|
||||
in
|
||||
# catch errors while building groupers before values are passed through
|
||||
deepSeq pipeList (flip pipe pipeList);
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue