Unverified Commit 7eddbf56 authored by Silvan Mosberger's avatar Silvan Mosberger Committed by GitHub
Browse files

Merge pull request #265710 from ShamrockLee/lib-copy-function-args

lib.mirrorFunctionArgs: init
parents 5d6c7322 b3e2c150
Loading
Loading
Loading
Loading
+10 −8
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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;
+34 −0
Original line number Diff line number Diff line
@@ -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.
+2 −2
Original line number Diff line number Diff line
@@ -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