instance-lifetime-fubar draft dev

Mon, 12 May 2025 21:26:04 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Mon, 12 May 2025 21:26:04 -0500
branch
dev
changeset 134
d65377920b00
parent 133
2b13f8a0c8ba
child 135
087c60877100

instance-lifetime-fubar

src/direct_product.rs file | annotate | diff | comparison | revisions
src/instance.rs file | annotate | diff | comparison | revisions
--- a/src/direct_product.rs	Mon May 12 20:40:14 2025 -0500
+++ b/src/direct_product.rs	Mon May 12 21:26:04 2025 -0500
@@ -397,13 +397,9 @@
             .eval_decompose(|a| self.1.eval_decompose(|b| f(Pair(a, b))))
     }
 
-    fn eval_ref_decompose<'b, R>(
-        &'b self,
-        f: impl FnOnce(Pair<D::Reference<'b>, Q::Reference<'b>>) -> R,
-    ) -> R
+    fn eval_ref_decompose<R, F>(&self, f: F) -> R
     where
-        Pair<A, B>: 'b,
-        Self: 'b,
+        F: for<'c> FnOnce(Pair<D::Reference<'c>, Q::Reference<'c>>) -> R,
     {
         self.0
             .eval_ref_decompose(|a| self.1.eval_ref_decompose(|b| f(Pair(a, b))))
@@ -439,6 +435,7 @@
         f: impl FnOnce(Pair<D::Decomposition<'b>, Q::Decomposition<'b>>) -> R,
     ) -> R
     where
+        R: 'b,
         Pair<A, B>: 'b,
         Self: 'b,
     {
@@ -448,13 +445,11 @@
         })
     }
 
-    fn eval_ref_decompose<'b, R>(
-        &'b self,
-        f: impl FnOnce(Pair<D::Reference<'b>, Q::Reference<'b>>) -> R,
-    ) -> R
+    fn eval_ref_decompose<'b, 'c, R, F>(&'b self, f: F) -> R
     where
-        Pair<A, B>: 'b,
+        Pair<A, B>: 'c,
         Self: 'b,
+        F: FnOnce(Pair<D::Reference<'c>, Q::Reference<'c>>) -> R,
     {
         self.0
             .eval_ref_decompose(|a| self.1.eval_ref_decompose(|b| f(Pair(a, b))))
--- a/src/instance.rs	Mon May 12 20:40:14 2025 -0500
+++ b/src/instance.rs	Mon May 12 21:26:04 2025 -0500
@@ -112,15 +112,18 @@
     /// Consumes self.
     fn eval_decompose<'b, R>(self, f: impl FnOnce(D::Decomposition<'b>) -> R) -> R
     where
+        R: 'b,
         X: 'b,
         Self: 'b;
 
     /// Does a light decomposition of self `decomposer`, and evaluates `f` on the result.
     /// Does not consume self.
-    fn eval_ref_decompose<'b, R>(&'b self, f: impl FnOnce(D::Reference<'b>) -> R) -> R
+    fn eval_ref_decompose<'b, 'c, R, F>(&'b self, f: F) -> R
     where
-        X: 'b,
-        Self: 'b;
+        X: 'c,
+        Self: 'b,
+        R: 'b,
+        F: FnOnce(D::Reference<'c>) -> R;
 
     /// Returns an owned instance of `X`, cloning or converting non-true instances when necessary.
     fn own(self) -> X;
@@ -175,10 +178,9 @@
     }
 
     #[inline]
-    fn eval_ref_decompose<'b, R>(&'b self, f: impl FnOnce(&'b X) -> R) -> R
+    fn eval_ref_decompose<R, F>(&self, f: F) -> R
     where
-        X: 'b,
-        Self: 'b,
+        F: for<'a> FnOnce(&'a X) -> R,
     {
         f(self)
     }
@@ -208,10 +210,9 @@
     }
 
     #[inline]
-    fn eval_ref_decompose<'b, R>(&'b self, f: impl FnOnce(&'b X) -> R) -> R
+    fn eval_ref_decompose<R, F>(&self, f: F) -> R
     where
-        X: 'b,
-        Self: 'b,
+        F: for<'c> FnOnce(&'c X) -> R,
     {
         f(*self)
     }
@@ -241,10 +242,9 @@
     }
 
     #[inline]
-    fn eval_ref_decompose<'b, R>(&'b self, f: impl FnOnce(&'b X) -> R) -> R
+    fn eval_ref_decompose<R, F>(&self, f: F) -> R
     where
-        X: 'b,
-        Self: 'b,
+        F: for<'c> FnOnce(&'c X) -> R,
     {
         f(*self)
     }
@@ -275,10 +275,9 @@
     }
 
     #[inline]
-    fn eval_ref_decompose<'b, R>(&'b self, f: impl FnOnce(&'b X) -> R) -> R
+    fn eval_ref_decompose<R, F>(&self, f: F) -> R
     where
-        X: 'b,
-        Self: 'b,
+        F: for<'c> FnOnce(&'c X) -> R,
     {
         match self {
             MyCow::Borrowed(a) => f(a),

mercurial