Skip to main content

ComposedLens

Struct ComposedLens 

Source
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>

Source

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.

Source

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}
Source

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,

Source

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}
Source

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§

Source§

impl<S, T, X, Y> Optic for ComposedLens<S, T, X, Y>

Auto Trait Implementations§

§

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> !UnwindSafe for ComposedLens<S, T, X, Y>

§

impl<S, T, X, Y> Freeze 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>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.