summary refs log tree commit diff
path: root/lib/fixed-points.nix
diff options
context:
space:
mode:
Diffstat (limited to 'lib/fixed-points.nix')
-rw-r--r--lib/fixed-points.nix11
1 files changed, 10 insertions, 1 deletions
diff --git a/lib/fixed-points.nix b/lib/fixed-points.nix
index 968930526a6..f998bc74e1d 100644
--- a/lib/fixed-points.nix
+++ b/lib/fixed-points.nix
@@ -1,4 +1,4 @@
-{ ... }:
+{ lib, ... }:
 rec {
   # Compute the fixed point of the given function `f`, which is usually an
   # attribute set that expects its final, non-recursive representation as an
@@ -77,6 +77,15 @@ rec {
           super' = super // fApplied;
       in fApplied // g self super';
 
+  # Compose several extending functions of the type expected by 'extends' into
+  # one where changes made in preceding functions are made available to
+  # subsequent ones.
+  #
+  # composeManyExtensions : [packageSet -> packageSet -> packageSet] -> packageSet -> packageSet -> packageSet
+  #                          ^final        ^prev         ^overrides     ^final        ^prev         ^overrides
+  composeManyExtensions =
+    lib.foldr (x: y: composeExtensions x y) (self: super: {});
+
   # Create an overridable, recursive attribute set. For example:
   #
   #     nix-repl> obj = makeExtensible (self: { })