src/instance.rs

branch
dev
changeset 170
221728aeeb7e
parent 168
93daa824c04a
child 171
fa8df5a14486
--- a/src/instance.rs	Wed Sep 03 19:37:15 2025 -0500
+++ b/src/instance.rs	Wed Sep 03 19:55:05 2025 -0500
@@ -340,6 +340,20 @@
         X: 'b,
         Self: 'b;
 
+    #[inline]
+    /// Evaluates `f` or `g` depending on whether a reference or owned value is available.
+    fn either<'b, R>(
+        self,
+        f: impl FnOnce(D::Decomposition<'b>) -> R,
+        g: impl FnOnce(D::Reference<'b>) -> R,
+    ) -> R
+    where
+        X: 'b,
+        Self: 'b,
+    {
+        self.eval_decompose(f)
+    }
+
     /// Returns an owned instance of `X`, cloning or converting non-true instances when necessary.
     fn own(self) -> X::Principal;
 
@@ -361,27 +375,17 @@
     {
         f(&*self.cow())
     }
+}
 
+impl<X: Space> Instance<X, BasicDecomposition> for X {
     #[inline]
-    /// Evaluates `f` or `g` depending on whether a reference or owned value is available.
-    ///
-    /// Default implementation uses [`Self::cow`]. Consumes the input.
-    fn either<'b, R>(
-        self,
-        f: impl FnOnce(X::Principal) -> R,
-        g: impl FnOnce(&X::Principal) -> R,
-    ) -> R
+    fn either<'b, R>(self, f: impl FnOnce(MyCow<'b, X>) -> R, _g: impl FnOnce(&'b X) -> R) -> R
     where
         Self: 'b,
     {
-        match self.cow() {
-            EitherDecomp::Owned(x) => f(x),
-            EitherDecomp::Borrowed(x) => g(x),
-        }
+        f(MyCow::Owned(self))
     }
-}
 
-impl<X: Space> Instance<X, BasicDecomposition> for X {
     #[inline]
     fn eval_decompose<'b, R>(self, f: impl FnOnce(MyCow<'b, X>) -> R) -> R
     where
@@ -416,6 +420,14 @@
 
 impl<'a, X: Space> Instance<X, BasicDecomposition> for &'a X {
     #[inline]
+    fn either<'b, R>(self, _f: impl FnOnce(MyCow<'b, X>) -> R, g: impl FnOnce(&'b X) -> R) -> R
+    where
+        Self: 'b,
+    {
+        g(self)
+    }
+
+    #[inline]
     fn eval_decompose<'b, R>(self, f: impl FnOnce(MyCow<'b, X>) -> R) -> R
     where
         X: 'b,
@@ -449,6 +461,14 @@
 
 impl<'a, X: Space> Instance<X, BasicDecomposition> for &'a mut X {
     #[inline]
+    fn either<'b, R>(self, _f: impl FnOnce(MyCow<'b, X>) -> R, g: impl FnOnce(&'b X) -> R) -> R
+    where
+        Self: 'b,
+    {
+        g(self)
+    }
+
+    #[inline]
     fn eval_decompose<'b, R>(self, f: impl FnOnce(MyCow<'b, X>) -> R) -> R
     where
         X: 'b,
@@ -482,6 +502,14 @@
 
 impl<'a, X: Space> Instance<X, BasicDecomposition> for MyCow<'a, X> {
     #[inline]
+    fn either<'b, R>(self, f: impl FnOnce(MyCow<'b, X>) -> R, _g: impl FnOnce(&'b X) -> R) -> R
+    where
+        Self: 'b,
+    {
+        f(self)
+    }
+
+    #[inline]
     fn eval_decompose<'b, R>(self, f: impl FnOnce(MyCow<'b, X>) -> R) -> R
     where
         X: 'b,

mercurial