Sun, 22 Dec 2024 17:42:14 -0500
ZeroOp
| 59 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 1 | /*! | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 2 | Helper traits to work with references or owned values of types and their subsets. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 3 | */ | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 4 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 5 | #[derive(Clone, Copy)] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 6 | pub enum EitherDecomp<A, B> { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 7 | Owned(A), | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 8 | Borrowed(B), | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 9 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 10 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 11 | /// A very basic implementation of [`Cow`] without a [`Clone`] trait dependency. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 12 | pub type MyCow<'b, X> = EitherDecomp<X, &'b X>; | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 13 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 14 | impl<'b, X> std::ops::Deref for MyCow<'b, X> { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 15 | type Target = X; | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 16 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 17 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 18 | fn deref(&self) -> &Self::Target { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 19 | match self { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 20 | EitherDecomp::Owned(x) => &x, | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 21 | EitherDecomp::Borrowed(x) => x, | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 22 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 23 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 24 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 25 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 26 | impl<'b, X> MyCow<'b, X> { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 27 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 28 | pub fn into_owned(self) -> X where X : Clone { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 29 | match self { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 30 | EitherDecomp::Owned(x) => x, | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 31 | EitherDecomp::Borrowed(x) => x.clone(), | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 32 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 33 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 34 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 35 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 36 | /// Trait for abitrary mathematical spaces. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 37 | pub trait Space : Instance<Self, Self::Decomp> { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 38 | /// Default decomposition for the space | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 39 | type Decomp : Decomposition<Self>; | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 40 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 41 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 42 | #[macro_export] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 43 | macro_rules! impl_basic_space { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 44 | ($($type:ty)*) => { $( | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 45 | impl $crate::instance::Space for $type { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 46 | type Decomp = $crate::instance::BasicDecomposition; | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 47 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 48 | )* }; | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 49 | ($type:ty where $($where:tt)*) => { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 50 | impl<$($where)*> $crate::instance::Space for $type { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 51 | type Decomp = $crate::instance::BasicDecomposition; | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 52 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 53 | }; | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 54 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 55 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 56 | impl_basic_space!(u8 u16 u32 u64 u128 usize | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 57 | i8 i16 i32 i64 i128 isize | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 58 | f32 f64); | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 59 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 60 | /// Marker type for decompositions to be used with [`Instance`]. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 61 | pub trait Decomposition<X : Space> : Sized { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 62 | /// Possibly owned form of the decomposition | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 63 | type Decomposition<'b> : Instance<X, Self> where X : 'b; | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 64 | /// Unlikely owned form of the decomposition. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 65 | /// Type for a lightweight intermediate conversion that does not own the original variable. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 66 | /// Usually this is just a reference, but may also be a lightweight structure that | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 67 | /// contains references; see the implementation for [`crate::direct_product::Pair`]. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 68 | type Reference<'b> : Instance<X, Self> + Copy where X : 'b; | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 69 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 70 | /// Left the lightweight reference type into a full decomposition type. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 71 | fn lift<'b>(r : Self::Reference<'b>) -> Self::Decomposition<'b>; | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 72 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 73 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 74 | /// Most common [`Decomposition`] (into `Either<X, &'b X>`) that allows working with owned | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 75 | /// values and all sorts of references. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 76 | #[derive(Copy, Clone, Debug)] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 77 | pub struct BasicDecomposition; | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 78 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 79 | impl<X : Space + Clone> Decomposition<X> for BasicDecomposition { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 80 | type Decomposition<'b> = MyCow<'b, X> where X : 'b; | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 81 | type Reference<'b> = &'b X where X : 'b; | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 82 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 83 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 84 | fn lift<'b>(r : Self::Reference<'b>) -> Self::Decomposition<'b> { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 85 | MyCow::Borrowed(r) | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 86 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 87 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 88 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 89 | /// Helper trait for functions to work with either owned values or references to either the | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 90 | /// “principal type” `X` or types some present a subset of `X`. In the latter sense, this | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 91 | /// generalises [`std::borrow::ToOwned`], [`std::borrow::Borrow`], and [`std::borrow::Cow`]. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 92 | /// This type also includes iteratation facilities when `X` is a [`Collection`], to avoid | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 93 | /// the possibly costly conversion of such subset types into `X`. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 94 | pub trait Instance<X : Space, D = <X as Space>::Decomp> : Sized where D : Decomposition<X> { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 95 | /// Decomposes self according to `decomposer`. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 96 | fn decompose<'b>(self) -> D::Decomposition<'b> | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 97 | where Self : 'b, X : 'b; | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 98 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 99 | /// Returns a lightweight instance of `self`. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 100 | fn ref_instance(&self) -> D::Reference<'_>; | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 101 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 102 | /// Returns an owned instance of `X`, cloning or converting non-true instances when necessary. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 103 | fn own(self) -> X; | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 104 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 105 | // ************** automatically implemented methods below from here ************** | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 106 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 107 | /// Returns an owned instance or reference to `X`, converting non-true instances when necessary. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 108 | /// | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 109 | /// Default implementation uses [`Self::own`]. Consumes the input. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 110 | fn cow<'b>(self) -> MyCow<'b, X> where Self : 'b { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 111 | MyCow::Owned(self.own()) | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 112 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 113 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 114 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 115 | /// Evaluates `f` on a reference to self. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 116 | /// | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 117 | /// Default implementation uses [`Self::cow`]. Consumes the input. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 118 | fn eval<'b, R>(self, f : impl FnOnce(&X) -> R) -> R | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 119 | where X : 'b, Self : 'b | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 120 | { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 121 | f(&*self.cow()) | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 122 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 123 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 124 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 125 | /// Evaluates `f` or `g` depending on whether a reference or owned value is available. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 126 | /// | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 127 | /// Default implementation uses [`Self::cow`]. Consumes the input. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 128 | fn either<'b, R>( | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 129 | self, | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 130 | f : impl FnOnce(X) -> R, | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 131 | g : impl FnOnce(&X) -> R | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 132 | ) -> R | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 133 | where Self : 'b | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 134 | { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 135 | match self.cow() { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 136 | EitherDecomp::Owned(x) => f(x), | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 137 | EitherDecomp::Borrowed(x) => g(x), | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 138 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 139 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 140 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 141 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 142 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 143 | impl<X : Space + Clone> Instance<X, BasicDecomposition> for X { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 144 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 145 | fn decompose<'b>(self) -> <BasicDecomposition as Decomposition<X>>::Decomposition<'b> | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 146 | where Self : 'b, X : 'b | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 147 | { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 148 | MyCow::Owned(self) | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 149 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 150 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 151 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 152 | fn own(self) -> X { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 153 | self | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 154 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 155 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 156 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 157 | fn cow<'b>(self) -> MyCow<'b, X> where Self : 'b { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 158 | MyCow::Owned(self) | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 159 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 160 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 161 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 162 | fn ref_instance(&self) -> <BasicDecomposition as Decomposition<X>>::Reference<'_> { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 163 | self | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 164 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 165 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 166 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 167 | impl<'a, X : Space + Clone> Instance<X, BasicDecomposition> for &'a X { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 168 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 169 | fn decompose<'b>(self) -> <BasicDecomposition as Decomposition<X>>::Decomposition<'b> | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 170 | where Self : 'b, X : 'b | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 171 | { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 172 | MyCow::Borrowed(self) | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 173 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 174 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 175 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 176 | fn own(self) -> X { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 177 | self.clone() | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 178 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 179 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 180 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 181 | fn cow<'b>(self) -> MyCow<'b, X> where Self : 'b { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 182 | MyCow::Borrowed(self) | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 183 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 184 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 185 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 186 | fn ref_instance(&self) -> <BasicDecomposition as Decomposition<X>>::Reference<'_> { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 187 | *self | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 188 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 189 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 190 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 191 | impl<'a, X : Space + Clone> Instance<X, BasicDecomposition> for &'a mut X { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 192 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 193 | fn decompose<'b>(self) -> <BasicDecomposition as Decomposition<X>>::Decomposition<'b> | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 194 | where Self : 'b, X : 'b | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 195 | { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 196 | EitherDecomp::Borrowed(self) | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 197 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 198 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 199 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 200 | fn own(self) -> X { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 201 | self.clone() | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 202 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 203 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 204 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 205 | fn cow<'b>(self) -> MyCow<'b, X> where Self : 'b, X : Clone { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 206 | EitherDecomp::Borrowed(self) | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 207 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 208 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 209 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 210 | fn ref_instance(&self) -> <BasicDecomposition as Decomposition<X>>::Reference<'_> { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 211 | *self | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 212 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 213 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 214 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 215 | impl<'a, X : Space + Clone> Instance<X, BasicDecomposition> for MyCow<'a, X> { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 216 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 217 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 218 | fn decompose<'b>(self) -> <BasicDecomposition as Decomposition<X>>::Decomposition<'b> | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 219 | where Self : 'b, X : 'b | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 220 | { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 221 | self | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 222 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 223 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 224 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 225 | fn own(self) -> X { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 226 | match self { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 227 | MyCow::Borrowed(a) => a.own(), | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 228 | MyCow::Owned(b) => b.own() | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 229 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 230 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 231 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 232 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 233 | fn cow<'b>(self) -> MyCow<'b, X> where Self : 'b { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 234 | match self { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 235 | MyCow::Borrowed(a) => a.cow(), | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 236 | MyCow::Owned(b) => b.cow() | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 237 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 238 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 239 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 240 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 241 | fn ref_instance(&self) -> <BasicDecomposition as Decomposition<X>>::Reference<'_> { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 242 | match self { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 243 | MyCow::Borrowed(a) => a, | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 244 | MyCow::Owned(b) => &b, | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 245 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 246 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 247 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 248 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 249 | /// Marker type for mutable decompositions to be used with [`InstanceMut`]. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 250 | pub trait DecompositionMut<X : Space> : Sized { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 251 | type ReferenceMut<'b> : InstanceMut<X, Self> where X : 'b; | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 252 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 253 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 254 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 255 | /// Helper trait for functions to work with mutable references. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 256 | pub trait InstanceMut<X : Space , D = <X as Space>::Decomp> : Sized where D : DecompositionMut<X> { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 257 | /// Returns a mutable decomposition of self. | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 258 | fn ref_instance_mut(&mut self) -> D::ReferenceMut<'_>; | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 259 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 260 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 261 | impl<X : Space> DecompositionMut<X> for BasicDecomposition { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 262 | type ReferenceMut<'b> = &'b mut X where X : 'b; | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 263 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 264 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 265 | /// This impl may seem pointless, but allows throwaway mutable scratch variables | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 266 | impl<'a, X : Space> InstanceMut<X, BasicDecomposition> for X { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 267 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 268 | fn ref_instance_mut(&mut self) | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 269 | -> <BasicDecomposition as DecompositionMut<X>>::ReferenceMut<'_> | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 270 | { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 271 | self | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 272 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 273 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 274 | |
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 275 | impl<'a, X : Space> InstanceMut<X, BasicDecomposition> for &'a mut X { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 276 | #[inline] | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 277 | fn ref_instance_mut(&mut self) | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 278 | -> <BasicDecomposition as DecompositionMut<X>>::ReferenceMut<'_> | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 279 | { | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 280 | self | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 281 | } | 
| 
9226980e45a7
Significantly simplify Mapping / Apply through Instance
 Tuomo Valkonen <tuomov@iki.fi> parents: diff
changeset | 282 | } |