Loading lib/customisation.nix +10 −8 Original line number Diff line number Diff line Loading @@ -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 // { Loading @@ -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 Loading lib/default.nix +1 −1 Original line number Diff line number Diff line Loading @@ -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; Loading lib/trivial.nix +34 −0 Original line number Diff line number Diff line Loading @@ -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. Loading pkgs/development/interpreters/python/python-packages-base.nix +2 −2 Original line number Diff line number Diff line Loading @@ -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: { Loading @@ -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 Loading
lib/customisation.nix +10 −8 Original line number Diff line number Diff line Loading @@ -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 // { Loading @@ -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 Loading
lib/default.nix +1 −1 Original line number Diff line number Diff line Loading @@ -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; Loading
lib/trivial.nix +34 −0 Original line number Diff line number Diff line Loading @@ -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. Loading
pkgs/development/interpreters/python/python-packages-base.nix +2 −2 Original line number Diff line number Diff line Loading @@ -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: { Loading @@ -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