pub struct ComposedLens<S, T, X, Y> { /* private fields */ }Expand description
A composed lens built from two lenses chained together.
Unlike Lens, which stores fn pointers, a composed lens stores
boxed closures because closure composition cannot produce fn pointers.
For profunctor-level composition, use nested Lens::transform calls
instead: outer.transform::<P>(inner.transform::<P>(pab)). This avoids
the need for Rc/Arc to share closures.
Implementations§
Source§impl<S, T, X, Y> ComposedLens<S, T, X, Y>
impl<S, T, X, Y> ComposedLens<S, T, X, Y>
Sourcepub fn from_fns(
getter: Box<dyn Fn(&S) -> X>,
setter: Box<dyn Fn(S, Y) -> T>,
) -> ComposedLens<S, T, X, Y>
pub fn from_fns( getter: Box<dyn Fn(&S) -> X>, setter: Box<dyn Fn(S, Y) -> T>, ) -> ComposedLens<S, T, X, Y>
Create a composed lens directly from boxed closures.
Sourcepub fn get(&self, s: &S) -> X
pub fn get(&self, s: &S) -> X
Examples found in repository?
examples/domain_model_optics.rs (line 178)
159fn main() {
160 println!("=== Domain Model with Optics Example ===\n");
161
162 let order = sample_order();
163
164 // 1. Lens: get/set/over
165 println!("--- Lens: basic get/set/over ---");
166 let customer = customer_lens();
167 let address = address_lens();
168 let city = city_lens();
169
170 println!(" Customer name: {}", name_lens().get(&order.customer));
171 println!(" City: {}", city.get(&address.get(&customer.get(&order))));
172
173 // 2. Composed Lens: deep access with .then()
174 println!("\n--- ComposedLens: deep access with .then() ---");
175 let order_city = customer_lens().then(address_lens()).then(city_lens());
176 let order_zip = customer_lens().then(address_lens()).then(zip_lens());
177
178 println!(" Order city: {}", order_city.get(&order));
179 println!(" Order zip: {}", order_zip.get(&order));
180
181 // Deep set
182 let updated = order_city.set(order.clone(), "Shelbyville".into());
183 println!(" After city update: {}", order_city.get(&updated));
184 println!(" Original unchanged: {}", order_city.get(&order));
185
186 // Deep over (modify)
187 let uppercased = order_city.over(order.clone(), |c| c.to_uppercase());
188 println!(" Uppercased city: {}", order_city.get(&uppercased));
189
190 // 3. Lens::transform — reusable update function
191 println!("\n--- Lens::transform — reusable update function ---");
192 let normalize_city: Box<dyn Fn(String) -> String> = Box::new(|c| c.trim().to_uppercase());
193 let normalize_order_city = city_lens().transform::<FnP>(normalize_city);
194 let addr = Address {
195 street: "456 Oak Ave".into(),
196 city: " new york ".into(),
197 zip: "10001".into(),
198 };
199 let normalized = normalize_order_city(addr);
200 println!(" Normalized city: {:?}", normalized.city);
201
202 // 4. Prism: sum type focus
203 println!("\n--- Prism: sum type focus ---");
204 let cc = credit_card_prism();
205 let wallet = wallet_prism();
206 let bank = bank_transfer_prism();
207
208 println!(" Credit card last4: {:?}", cc.preview(&order.payment));
209 println!(" Wallet preview: {:?}", wallet.preview(&order.payment));
210
211 // Prism::review — construct a variant
212 let new_payment = wallet.review(("PayPal".into(), 5000));
213 println!(" New wallet payment: {:?}", new_payment);
214
215 // Prism::over — modify only if matched
216 let updated_payment = cc.over(order.payment.clone(), |(last4, _exp)| {
217 (last4, "01/28".into())
218 });
219 println!(" Updated CC expiry: {:?}", updated_payment);
220
221 // Prism on non-matching variant: passes through unchanged
222 let unchanged = wallet.over(order.payment.clone(), |(prov, bal)| (prov, bal + 1000));
223 println!(" Wallet over on CC (unchanged): {:?}", unchanged);
224
225 // 5. Prism::transform — reusable pattern-matching function
226 println!("\n--- Prism::transform — reusable variant modifier ---");
227 let add_balance: Box<dyn Fn((String, i64)) -> (String, i64)> =
228 Box::new(|(prov, bal)| (prov, bal + 2500));
229 let add_wallet_balance = wallet.transform::<FnP>(add_balance);
230
231 let wallet_payment = Payment::Wallet {
232 provider: "PayPal".into(),
233 balance_cents: 10000,
234 };
235 let topped_up = add_wallet_balance(wallet_payment);
236 println!(" Topped up: {:?}", topped_up);
237
238 // Apply same transform to non-wallet — passes through
239 let still_cc = add_wallet_balance(order.payment.clone());
240 println!(" CC unchanged: {:?}", still_cc);
241
242 // 6. Summary: combine multiple optics
243 println!("\n--- Combining lenses and prisms ---");
244 let orders = vec![
245 sample_order(),
246 Order {
247 id: 1002,
248 customer: Customer {
249 name: "Bob Jones".into(),
250 address: Address {
251 street: "789 Elm St".into(),
252 city: "Capital City".into(),
253 zip: "12345".into(),
254 },
255 },
256 items: vec![Item {
257 name: "Mouse".into(),
258 price_cents: 2999,
259 quantity: 1,
260 }],
261 payment: Payment::Wallet {
262 provider: "Stripe".into(),
263 balance_cents: 50000,
264 },
265 },
266 Order {
267 id: 1003,
268 customer: Customer {
269 name: "Carol White".into(),
270 address: Address {
271 street: "321 Pine Rd".into(),
272 city: "Springfield".into(),
273 zip: "62702".into(),
274 },
275 },
276 items: vec![],
277 payment: Payment::BankTransfer {
278 iban: "DE89370400440532013000".into(),
279 },
280 },
281 ];
282
283 let order_city_lens = customer_lens().then(address_lens()).then(city_lens());
284 println!(" All cities:");
285 for o in &orders {
286 let payment_type = match &o.payment {
287 Payment::CreditCard { .. } => "CC",
288 Payment::BankTransfer { .. } => "Bank",
289 Payment::Wallet { .. } => "Wallet",
290 };
291 println!(
292 " Order #{}: {} ({}, pays via {})",
293 o.id,
294 order_city_lens.get(o),
295 name_lens().get(&o.customer),
296 payment_type
297 );
298 }
299
300 // Find all bank IBANs using Prism
301 println!("\n Bank IBANs:");
302 for o in &orders {
303 if let Some(iban) = bank.preview(&o.payment) {
304 println!(" Order #{}: {}", o.id, iban);
305 }
306 }
307}Sourcepub fn set(&self, s: S, y: Y) -> T
pub fn set(&self, s: S, y: Y) -> T
Examples found in repository?
examples/domain_model_optics.rs (line 182)
159fn main() {
160 println!("=== Domain Model with Optics Example ===\n");
161
162 let order = sample_order();
163
164 // 1. Lens: get/set/over
165 println!("--- Lens: basic get/set/over ---");
166 let customer = customer_lens();
167 let address = address_lens();
168 let city = city_lens();
169
170 println!(" Customer name: {}", name_lens().get(&order.customer));
171 println!(" City: {}", city.get(&address.get(&customer.get(&order))));
172
173 // 2. Composed Lens: deep access with .then()
174 println!("\n--- ComposedLens: deep access with .then() ---");
175 let order_city = customer_lens().then(address_lens()).then(city_lens());
176 let order_zip = customer_lens().then(address_lens()).then(zip_lens());
177
178 println!(" Order city: {}", order_city.get(&order));
179 println!(" Order zip: {}", order_zip.get(&order));
180
181 // Deep set
182 let updated = order_city.set(order.clone(), "Shelbyville".into());
183 println!(" After city update: {}", order_city.get(&updated));
184 println!(" Original unchanged: {}", order_city.get(&order));
185
186 // Deep over (modify)
187 let uppercased = order_city.over(order.clone(), |c| c.to_uppercase());
188 println!(" Uppercased city: {}", order_city.get(&uppercased));
189
190 // 3. Lens::transform — reusable update function
191 println!("\n--- Lens::transform — reusable update function ---");
192 let normalize_city: Box<dyn Fn(String) -> String> = Box::new(|c| c.trim().to_uppercase());
193 let normalize_order_city = city_lens().transform::<FnP>(normalize_city);
194 let addr = Address {
195 street: "456 Oak Ave".into(),
196 city: " new york ".into(),
197 zip: "10001".into(),
198 };
199 let normalized = normalize_order_city(addr);
200 println!(" Normalized city: {:?}", normalized.city);
201
202 // 4. Prism: sum type focus
203 println!("\n--- Prism: sum type focus ---");
204 let cc = credit_card_prism();
205 let wallet = wallet_prism();
206 let bank = bank_transfer_prism();
207
208 println!(" Credit card last4: {:?}", cc.preview(&order.payment));
209 println!(" Wallet preview: {:?}", wallet.preview(&order.payment));
210
211 // Prism::review — construct a variant
212 let new_payment = wallet.review(("PayPal".into(), 5000));
213 println!(" New wallet payment: {:?}", new_payment);
214
215 // Prism::over — modify only if matched
216 let updated_payment = cc.over(order.payment.clone(), |(last4, _exp)| {
217 (last4, "01/28".into())
218 });
219 println!(" Updated CC expiry: {:?}", updated_payment);
220
221 // Prism on non-matching variant: passes through unchanged
222 let unchanged = wallet.over(order.payment.clone(), |(prov, bal)| (prov, bal + 1000));
223 println!(" Wallet over on CC (unchanged): {:?}", unchanged);
224
225 // 5. Prism::transform — reusable pattern-matching function
226 println!("\n--- Prism::transform — reusable variant modifier ---");
227 let add_balance: Box<dyn Fn((String, i64)) -> (String, i64)> =
228 Box::new(|(prov, bal)| (prov, bal + 2500));
229 let add_wallet_balance = wallet.transform::<FnP>(add_balance);
230
231 let wallet_payment = Payment::Wallet {
232 provider: "PayPal".into(),
233 balance_cents: 10000,
234 };
235 let topped_up = add_wallet_balance(wallet_payment);
236 println!(" Topped up: {:?}", topped_up);
237
238 // Apply same transform to non-wallet — passes through
239 let still_cc = add_wallet_balance(order.payment.clone());
240 println!(" CC unchanged: {:?}", still_cc);
241
242 // 6. Summary: combine multiple optics
243 println!("\n--- Combining lenses and prisms ---");
244 let orders = vec![
245 sample_order(),
246 Order {
247 id: 1002,
248 customer: Customer {
249 name: "Bob Jones".into(),
250 address: Address {
251 street: "789 Elm St".into(),
252 city: "Capital City".into(),
253 zip: "12345".into(),
254 },
255 },
256 items: vec![Item {
257 name: "Mouse".into(),
258 price_cents: 2999,
259 quantity: 1,
260 }],
261 payment: Payment::Wallet {
262 provider: "Stripe".into(),
263 balance_cents: 50000,
264 },
265 },
266 Order {
267 id: 1003,
268 customer: Customer {
269 name: "Carol White".into(),
270 address: Address {
271 street: "321 Pine Rd".into(),
272 city: "Springfield".into(),
273 zip: "62702".into(),
274 },
275 },
276 items: vec![],
277 payment: Payment::BankTransfer {
278 iban: "DE89370400440532013000".into(),
279 },
280 },
281 ];
282
283 let order_city_lens = customer_lens().then(address_lens()).then(city_lens());
284 println!(" All cities:");
285 for o in &orders {
286 let payment_type = match &o.payment {
287 Payment::CreditCard { .. } => "CC",
288 Payment::BankTransfer { .. } => "Bank",
289 Payment::Wallet { .. } => "Wallet",
290 };
291 println!(
292 " Order #{}: {} ({}, pays via {})",
293 o.id,
294 order_city_lens.get(o),
295 name_lens().get(&o.customer),
296 payment_type
297 );
298 }
299
300 // Find all bank IBANs using Prism
301 println!("\n Bank IBANs:");
302 for o in &orders {
303 if let Some(iban) = bank.preview(&o.payment) {
304 println!(" Order #{}: {}", o.id, iban);
305 }
306 }
307}Source§impl<S, T, X, Y> ComposedLens<S, T, X, Y>where
S: Clone,
impl<S, T, X, Y> ComposedLens<S, T, X, Y>where
S: Clone,
Sourcepub fn over(&self, s: S, f: impl FnOnce(X) -> Y) -> T
pub fn over(&self, s: S, f: impl FnOnce(X) -> Y) -> T
Examples found in repository?
examples/domain_model_optics.rs (line 187)
159fn main() {
160 println!("=== Domain Model with Optics Example ===\n");
161
162 let order = sample_order();
163
164 // 1. Lens: get/set/over
165 println!("--- Lens: basic get/set/over ---");
166 let customer = customer_lens();
167 let address = address_lens();
168 let city = city_lens();
169
170 println!(" Customer name: {}", name_lens().get(&order.customer));
171 println!(" City: {}", city.get(&address.get(&customer.get(&order))));
172
173 // 2. Composed Lens: deep access with .then()
174 println!("\n--- ComposedLens: deep access with .then() ---");
175 let order_city = customer_lens().then(address_lens()).then(city_lens());
176 let order_zip = customer_lens().then(address_lens()).then(zip_lens());
177
178 println!(" Order city: {}", order_city.get(&order));
179 println!(" Order zip: {}", order_zip.get(&order));
180
181 // Deep set
182 let updated = order_city.set(order.clone(), "Shelbyville".into());
183 println!(" After city update: {}", order_city.get(&updated));
184 println!(" Original unchanged: {}", order_city.get(&order));
185
186 // Deep over (modify)
187 let uppercased = order_city.over(order.clone(), |c| c.to_uppercase());
188 println!(" Uppercased city: {}", order_city.get(&uppercased));
189
190 // 3. Lens::transform — reusable update function
191 println!("\n--- Lens::transform — reusable update function ---");
192 let normalize_city: Box<dyn Fn(String) -> String> = Box::new(|c| c.trim().to_uppercase());
193 let normalize_order_city = city_lens().transform::<FnP>(normalize_city);
194 let addr = Address {
195 street: "456 Oak Ave".into(),
196 city: " new york ".into(),
197 zip: "10001".into(),
198 };
199 let normalized = normalize_order_city(addr);
200 println!(" Normalized city: {:?}", normalized.city);
201
202 // 4. Prism: sum type focus
203 println!("\n--- Prism: sum type focus ---");
204 let cc = credit_card_prism();
205 let wallet = wallet_prism();
206 let bank = bank_transfer_prism();
207
208 println!(" Credit card last4: {:?}", cc.preview(&order.payment));
209 println!(" Wallet preview: {:?}", wallet.preview(&order.payment));
210
211 // Prism::review — construct a variant
212 let new_payment = wallet.review(("PayPal".into(), 5000));
213 println!(" New wallet payment: {:?}", new_payment);
214
215 // Prism::over — modify only if matched
216 let updated_payment = cc.over(order.payment.clone(), |(last4, _exp)| {
217 (last4, "01/28".into())
218 });
219 println!(" Updated CC expiry: {:?}", updated_payment);
220
221 // Prism on non-matching variant: passes through unchanged
222 let unchanged = wallet.over(order.payment.clone(), |(prov, bal)| (prov, bal + 1000));
223 println!(" Wallet over on CC (unchanged): {:?}", unchanged);
224
225 // 5. Prism::transform — reusable pattern-matching function
226 println!("\n--- Prism::transform — reusable variant modifier ---");
227 let add_balance: Box<dyn Fn((String, i64)) -> (String, i64)> =
228 Box::new(|(prov, bal)| (prov, bal + 2500));
229 let add_wallet_balance = wallet.transform::<FnP>(add_balance);
230
231 let wallet_payment = Payment::Wallet {
232 provider: "PayPal".into(),
233 balance_cents: 10000,
234 };
235 let topped_up = add_wallet_balance(wallet_payment);
236 println!(" Topped up: {:?}", topped_up);
237
238 // Apply same transform to non-wallet — passes through
239 let still_cc = add_wallet_balance(order.payment.clone());
240 println!(" CC unchanged: {:?}", still_cc);
241
242 // 6. Summary: combine multiple optics
243 println!("\n--- Combining lenses and prisms ---");
244 let orders = vec![
245 sample_order(),
246 Order {
247 id: 1002,
248 customer: Customer {
249 name: "Bob Jones".into(),
250 address: Address {
251 street: "789 Elm St".into(),
252 city: "Capital City".into(),
253 zip: "12345".into(),
254 },
255 },
256 items: vec![Item {
257 name: "Mouse".into(),
258 price_cents: 2999,
259 quantity: 1,
260 }],
261 payment: Payment::Wallet {
262 provider: "Stripe".into(),
263 balance_cents: 50000,
264 },
265 },
266 Order {
267 id: 1003,
268 customer: Customer {
269 name: "Carol White".into(),
270 address: Address {
271 street: "321 Pine Rd".into(),
272 city: "Springfield".into(),
273 zip: "62702".into(),
274 },
275 },
276 items: vec![],
277 payment: Payment::BankTransfer {
278 iban: "DE89370400440532013000".into(),
279 },
280 },
281 ];
282
283 let order_city_lens = customer_lens().then(address_lens()).then(city_lens());
284 println!(" All cities:");
285 for o in &orders {
286 let payment_type = match &o.payment {
287 Payment::CreditCard { .. } => "CC",
288 Payment::BankTransfer { .. } => "Bank",
289 Payment::Wallet { .. } => "Wallet",
290 };
291 println!(
292 " Order #{}: {} ({}, pays via {})",
293 o.id,
294 order_city_lens.get(o),
295 name_lens().get(&o.customer),
296 payment_type
297 );
298 }
299
300 // Find all bank IBANs using Prism
301 println!("\n Bank IBANs:");
302 for o in &orders {
303 if let Some(iban) = bank.preview(&o.payment) {
304 println!(" Order #{}: {}", o.id, iban);
305 }
306 }
307}Sourcepub fn then<U, V>(self, inner: Lens<X, Y, U, V>) -> ComposedLens<S, T, U, V>where
S: 'static,
T: 'static,
X: 'static,
Y: 'static,
U: 'static,
V: 'static,
pub fn then<U, V>(self, inner: Lens<X, Y, U, V>) -> ComposedLens<S, T, U, V>where
S: 'static,
T: 'static,
X: 'static,
Y: 'static,
U: 'static,
V: 'static,
Chain another lens to focus deeper.
Examples found in repository?
examples/domain_model_optics.rs (line 175)
159fn main() {
160 println!("=== Domain Model with Optics Example ===\n");
161
162 let order = sample_order();
163
164 // 1. Lens: get/set/over
165 println!("--- Lens: basic get/set/over ---");
166 let customer = customer_lens();
167 let address = address_lens();
168 let city = city_lens();
169
170 println!(" Customer name: {}", name_lens().get(&order.customer));
171 println!(" City: {}", city.get(&address.get(&customer.get(&order))));
172
173 // 2. Composed Lens: deep access with .then()
174 println!("\n--- ComposedLens: deep access with .then() ---");
175 let order_city = customer_lens().then(address_lens()).then(city_lens());
176 let order_zip = customer_lens().then(address_lens()).then(zip_lens());
177
178 println!(" Order city: {}", order_city.get(&order));
179 println!(" Order zip: {}", order_zip.get(&order));
180
181 // Deep set
182 let updated = order_city.set(order.clone(), "Shelbyville".into());
183 println!(" After city update: {}", order_city.get(&updated));
184 println!(" Original unchanged: {}", order_city.get(&order));
185
186 // Deep over (modify)
187 let uppercased = order_city.over(order.clone(), |c| c.to_uppercase());
188 println!(" Uppercased city: {}", order_city.get(&uppercased));
189
190 // 3. Lens::transform — reusable update function
191 println!("\n--- Lens::transform — reusable update function ---");
192 let normalize_city: Box<dyn Fn(String) -> String> = Box::new(|c| c.trim().to_uppercase());
193 let normalize_order_city = city_lens().transform::<FnP>(normalize_city);
194 let addr = Address {
195 street: "456 Oak Ave".into(),
196 city: " new york ".into(),
197 zip: "10001".into(),
198 };
199 let normalized = normalize_order_city(addr);
200 println!(" Normalized city: {:?}", normalized.city);
201
202 // 4. Prism: sum type focus
203 println!("\n--- Prism: sum type focus ---");
204 let cc = credit_card_prism();
205 let wallet = wallet_prism();
206 let bank = bank_transfer_prism();
207
208 println!(" Credit card last4: {:?}", cc.preview(&order.payment));
209 println!(" Wallet preview: {:?}", wallet.preview(&order.payment));
210
211 // Prism::review — construct a variant
212 let new_payment = wallet.review(("PayPal".into(), 5000));
213 println!(" New wallet payment: {:?}", new_payment);
214
215 // Prism::over — modify only if matched
216 let updated_payment = cc.over(order.payment.clone(), |(last4, _exp)| {
217 (last4, "01/28".into())
218 });
219 println!(" Updated CC expiry: {:?}", updated_payment);
220
221 // Prism on non-matching variant: passes through unchanged
222 let unchanged = wallet.over(order.payment.clone(), |(prov, bal)| (prov, bal + 1000));
223 println!(" Wallet over on CC (unchanged): {:?}", unchanged);
224
225 // 5. Prism::transform — reusable pattern-matching function
226 println!("\n--- Prism::transform — reusable variant modifier ---");
227 let add_balance: Box<dyn Fn((String, i64)) -> (String, i64)> =
228 Box::new(|(prov, bal)| (prov, bal + 2500));
229 let add_wallet_balance = wallet.transform::<FnP>(add_balance);
230
231 let wallet_payment = Payment::Wallet {
232 provider: "PayPal".into(),
233 balance_cents: 10000,
234 };
235 let topped_up = add_wallet_balance(wallet_payment);
236 println!(" Topped up: {:?}", topped_up);
237
238 // Apply same transform to non-wallet — passes through
239 let still_cc = add_wallet_balance(order.payment.clone());
240 println!(" CC unchanged: {:?}", still_cc);
241
242 // 6. Summary: combine multiple optics
243 println!("\n--- Combining lenses and prisms ---");
244 let orders = vec![
245 sample_order(),
246 Order {
247 id: 1002,
248 customer: Customer {
249 name: "Bob Jones".into(),
250 address: Address {
251 street: "789 Elm St".into(),
252 city: "Capital City".into(),
253 zip: "12345".into(),
254 },
255 },
256 items: vec![Item {
257 name: "Mouse".into(),
258 price_cents: 2999,
259 quantity: 1,
260 }],
261 payment: Payment::Wallet {
262 provider: "Stripe".into(),
263 balance_cents: 50000,
264 },
265 },
266 Order {
267 id: 1003,
268 customer: Customer {
269 name: "Carol White".into(),
270 address: Address {
271 street: "321 Pine Rd".into(),
272 city: "Springfield".into(),
273 zip: "62702".into(),
274 },
275 },
276 items: vec![],
277 payment: Payment::BankTransfer {
278 iban: "DE89370400440532013000".into(),
279 },
280 },
281 ];
282
283 let order_city_lens = customer_lens().then(address_lens()).then(city_lens());
284 println!(" All cities:");
285 for o in &orders {
286 let payment_type = match &o.payment {
287 Payment::CreditCard { .. } => "CC",
288 Payment::BankTransfer { .. } => "Bank",
289 Payment::Wallet { .. } => "Wallet",
290 };
291 println!(
292 " Order #{}: {} ({}, pays via {})",
293 o.id,
294 order_city_lens.get(o),
295 name_lens().get(&o.customer),
296 payment_type
297 );
298 }
299
300 // Find all bank IBANs using Prism
301 println!("\n Bank IBANs:");
302 for o in &orders {
303 if let Some(iban) = bank.preview(&o.payment) {
304 println!(" Order #{}: {}", o.id, iban);
305 }
306 }
307}Trait Implementations§
impl<S, T, X, Y> Optic for ComposedLens<S, T, X, Y>
Auto Trait Implementations§
impl<S, T, X, Y> Freeze for ComposedLens<S, T, X, Y>
impl<S, T, X, Y> !RefUnwindSafe for ComposedLens<S, T, X, Y>
impl<S, T, X, Y> !Send for ComposedLens<S, T, X, Y>
impl<S, T, X, Y> !Sync for ComposedLens<S, T, X, Y>
impl<S, T, X, Y> Unpin for ComposedLens<S, T, X, Y>
impl<S, T, X, Y> UnsafeUnpin for ComposedLens<S, T, X, Y>
impl<S, T, X, Y> !UnwindSafe for ComposedLens<S, T, X, Y>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more