lib/makeOverridable: Propagate function arguments to override functions

This allows querying the arguments you can .override:

  nix-repl> lib.functionArgs pkgs.hello.override
  { fetchurl = false; stdenv = false; }
This commit is contained in:
Silvan Mosberger 2019-09-05 00:13:24 +02:00
parent e140d709c4
commit d54bdf5504
No known key found for this signature in database
GPG Key ID: 9424360B4B85C9E7

View File

@ -67,12 +67,14 @@ rec {
makeOverridable = f: origArgs:
let
ff = f origArgs;
# Creates a functor with the same arguments as f
copyArgs = g: lib.setFunctionArgs g (lib.functionArgs f);
overrideWith = newArgs: origArgs // (if lib.isFunction newArgs then newArgs origArgs else newArgs);
# Re-call the function but with different arguments
overrideArgs = newArgs: makeOverridable f (overrideWith newArgs);
overrideArgs = copyArgs (newArgs: makeOverridable f (overrideWith newArgs));
# Change the result of the function call by applying g to it
overrideResult = g: makeOverridable (args: g (f args)) origArgs;
overrideResult = g: makeOverridable (copyArgs (args: g (f args))) origArgs;
in
if builtins.isAttrs ff then (ff // {
override = overrideArgs;