infra/flake/den/nix/fn-can-take.nix
2025-12-01 13:23:24 +07:00

24 lines
766 B
Nix

lib:
let
check =
params: func:
let
givenArgs = builtins.isAttrs params;
fargs = lib.functionArgs func;
provided = builtins.attrNames params;
args = lib.mapAttrsToList (name: optional: { inherit name optional; }) fargs;
required = map (x: x.name) (lib.filter (x: !x.optional) args);
intersection = lib.intersectLists required provided;
satisfied = givenArgs && lib.length required == lib.length intersection;
noExtras = lib.length required == lib.length provided;
exactly = satisfied && noExtras;
in
{
inherit satisfied exactly;
};
in
{
__functor = self: self.atLeast;
atLeast = params: func: (check params func).satisfied;
exactly = params: func: (check params func).exactly;
}