Merge pull request #265710 from ShamrockLee/lib-copy-function-args
lib.mirrorFunctionArgs: init
This commit is contained in:
commit
7eddbf5690
|
@ -76,19 +76,22 @@ rec {
|
|||
Type:
|
||||
makeOverridable :: (AttrSet -> a) -> AttrSet -> a
|
||||
*/
|
||||
makeOverridable = f: lib.setFunctionArgs
|
||||
(origArgs: let
|
||||
makeOverridable = f:
|
||||
let
|
||||
# Creates a functor with the same arguments as f
|
||||
mirrorArgs = lib.mirrorFunctionArgs f;
|
||||
in
|
||||
mirrorArgs (origArgs:
|
||||
let
|
||||
result = f origArgs;
|
||||
|
||||
# Creates a functor with the same arguments as f
|
||||
copyArgs = g: lib.setFunctionArgs g (lib.functionArgs f);
|
||||
# Changes the original arguments with (potentially a function that returns) a set of new attributes
|
||||
overrideWith = newArgs: origArgs // (if lib.isFunction newArgs then newArgs origArgs else newArgs);
|
||||
|
||||
# Re-call the function but with different arguments
|
||||
overrideArgs = copyArgs (newArgs: makeOverridable f (overrideWith newArgs));
|
||||
overrideArgs = mirrorArgs (newArgs: makeOverridable f (overrideWith newArgs));
|
||||
# Change the result of the function call by applying g to it
|
||||
overrideResult = g: makeOverridable (copyArgs (args: g (f args))) origArgs;
|
||||
overrideResult = g: makeOverridable (mirrorArgs (args: g (f args))) origArgs;
|
||||
in
|
||||
if builtins.isAttrs result then
|
||||
result // {
|
||||
|
@ -102,8 +105,7 @@ rec {
|
|||
lib.setFunctionArgs result (lib.functionArgs result) // {
|
||||
override = overrideArgs;
|
||||
}
|
||||
else result)
|
||||
(lib.functionArgs f);
|
||||
else result);
|
||||
|
||||
|
||||
/* Call the package function in the file `fn` with the required
|
||||
|
|
|
@ -74,7 +74,7 @@ let
|
|||
importJSON importTOML warn warnIf warnIfNot throwIf throwIfNot checkListOfEnum
|
||||
info showWarnings nixpkgsVersion version isInOldestRelease
|
||||
mod compare splitByAndCompare
|
||||
functionArgs setFunctionArgs isFunction toFunction
|
||||
functionArgs setFunctionArgs isFunction toFunction mirrorFunctionArgs
|
||||
toHexString toBaseDigits inPureEvalMode;
|
||||
inherit (self.fixedPoints) fix fix' converge extends composeExtensions
|
||||
composeManyExtensions makeExtensible makeExtensibleWithCustomName;
|
||||
|
|
|
@ -448,6 +448,40 @@ rec {
|
|||
isFunction = f: builtins.isFunction f ||
|
||||
(f ? __functor && isFunction (f.__functor f));
|
||||
|
||||
/*
|
||||
`mirrorFunctionArgs f g` creates a new function `g'` with the same behavior as `g` (`g' x == g x`)
|
||||
but its function arguments mirroring `f` (`lib.functionArgs g' == lib.functionArgs f`).
|
||||
|
||||
Type:
|
||||
mirrorFunctionArgs :: (a -> b) -> (a -> c) -> (a -> c)
|
||||
|
||||
Example:
|
||||
addab = {a, b}: a + b
|
||||
addab { a = 2; b = 4; }
|
||||
=> 6
|
||||
lib.functionArgs addab
|
||||
=> { a = false; b = false; }
|
||||
addab1 = attrs: addab attrs + 1
|
||||
addab1 { a = 2; b = 4; }
|
||||
=> 7
|
||||
lib.functionArgs addab1
|
||||
=> { }
|
||||
addab1' = lib.mirrorFunctionArgs addab addab1
|
||||
addab1' { a = 2; b = 4; }
|
||||
=> 7
|
||||
lib.functionArgs addab1'
|
||||
=> { a = false; b = false; }
|
||||
*/
|
||||
mirrorFunctionArgs =
|
||||
# Function to provide the argument metadata
|
||||
f:
|
||||
let
|
||||
fArgs = functionArgs f;
|
||||
in
|
||||
# Function to set the argument metadata to
|
||||
g:
|
||||
setFunctionArgs g fArgs;
|
||||
|
||||
/*
|
||||
Turns any non-callable values into constant functions.
|
||||
Returns callable values as is.
|
||||
|
|
|
@ -13,7 +13,7 @@ let
|
|||
|
||||
# Derivations built with `buildPythonPackage` can already be overridden with `override`, `overrideAttrs`, and `overrideDerivation`.
|
||||
# This function introduces `overridePythonAttrs` and it overrides the call to `buildPythonPackage`.
|
||||
makeOverridablePythonPackage = f: origArgs:
|
||||
makeOverridablePythonPackage = f: lib.mirrorFunctionArgs f (origArgs:
|
||||
let
|
||||
args = lib.fix (lib.extends
|
||||
(_: previousAttrs: {
|
||||
|
@ -30,7 +30,7 @@ let
|
|||
overridePythonAttrs = newArgs: makeOverridablePythonPackage f (overrideWith newArgs);
|
||||
__functor = self: result;
|
||||
}
|
||||
else result;
|
||||
else result);
|
||||
|
||||
mkPythonDerivation = if python.isPy3k then
|
||||
./mk-python-derivation.nix
|
||||
|
|
Loading…
Reference in New Issue
Block a user