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.nix10
1 files changed, 10 insertions, 0 deletions
diff --git a/lib/fixed-points.nix b/lib/fixed-points.nix
index 7169c46fcbb..2f818c88de5 100644
--- a/lib/fixed-points.nix
+++ b/lib/fixed-points.nix
@@ -24,6 +24,16 @@ rec {
   # for a concrete example.
   fix' = f: let x = f x // { __unfix__ = f; }; in x;
 
+  # Return the fixpoint that `f` converges to when called recursively, starting
+  # with the input `x`.
+  #
+  #     nix-repl> converge (x: x / 2) 16
+  #     0
+  converge = f: x:
+    if (f x) == x
+    then x
+    else converge f (f x);
+
   # Modify the contents of an explicitly recursive attribute set in a way that
   # honors `self`-references. This is accomplished with a function
   #