| 383 D: Decomposition<A>, |
383 D: Decomposition<A>, |
| 384 Q: Decomposition<B>, |
384 Q: Decomposition<B>, |
| 385 U: Instance<A, D>, |
385 U: Instance<A, D>, |
| 386 V: Instance<B, Q>, |
386 V: Instance<B, Q>, |
| 387 { |
387 { |
| 388 fn eval_decompose<'b, R>( |
388 fn eval_decompose<'c, R>( |
| 389 self, |
389 self, |
| 390 f: impl FnOnce(Pair<D::Decomposition<'b>, Q::Decomposition<'b>>) -> R, |
390 f: impl FnOnce(Pair<D::Decomposition<'c>, Q::Decomposition<'c>>) -> R, |
| 391 ) -> R |
391 ) -> R |
| 392 where |
392 where |
| 393 Pair<A, B>: 'b, |
393 Pair<A, B>: 'c, |
| 394 Self: 'b, |
|
| 395 { |
394 { |
| 396 self.0 |
395 self.0 |
| 397 .eval_decompose(|a| self.1.eval_decompose(|b| f(Pair(a, b)))) |
396 .eval_decompose(|a| self.1.eval_decompose(|b| f(Pair(a, b)))) |
| 398 } |
397 } |
| 399 |
398 |
| 400 fn eval_ref_decompose<R, F>(&self, f: F) -> R |
399 fn eval_ref_decompose<'c, R>( |
| 401 where |
400 &self, |
| 402 F: for<'c> FnOnce(Pair<D::Reference<'c>, Q::Reference<'c>>) -> R, |
401 f: impl FnOnce(Pair<D::Reference<'c>, Q::Reference<'c>>) -> R, |
| |
402 ) -> R |
| |
403 where |
| |
404 Pair<A, B>: 'c, |
| 403 { |
405 { |
| 404 self.0 |
406 self.0 |
| 405 .eval_ref_decompose(|a| self.1.eval_ref_decompose(|b| f(Pair(a, b)))) |
407 .eval_ref_decompose(|a| self.1.eval_ref_decompose(|b| f(Pair(a, b)))) |
| 406 } |
408 } |
| 407 |
409 |
| 428 U: Instance<A, D>, |
430 U: Instance<A, D>, |
| 429 V: Instance<B, Q>, |
431 V: Instance<B, Q>, |
| 430 &'a U: Instance<A, D>, |
432 &'a U: Instance<A, D>, |
| 431 &'a V: Instance<B, Q>, |
433 &'a V: Instance<B, Q>, |
| 432 { |
434 { |
| 433 fn eval_decompose<'b, R>( |
435 fn eval_decompose<'c, R>( |
| 434 self, |
436 self, |
| 435 f: impl FnOnce(Pair<D::Decomposition<'b>, Q::Decomposition<'b>>) -> R, |
437 f: impl FnOnce(Pair<D::Decomposition<'c>, Q::Decomposition<'c>>) -> R, |
| 436 ) -> R |
438 ) -> R |
| 437 where |
439 where |
| 438 R: 'b, |
440 Pair<A, B>: 'c, |
| 439 Pair<A, B>: 'b, |
|
| 440 Self: 'b, |
|
| 441 { |
441 { |
| 442 self.0.eval_ref_decompose(|a| { |
442 self.0.eval_ref_decompose(|a| { |
| 443 self.1 |
443 self.1 |
| 444 .eval_ref_decompose(|b| f(Pair(D::lift(a), Q::lift(b)))) |
444 .eval_ref_decompose(|b| f(Pair(D::lift(a), Q::lift(b)))) |
| 445 }) |
445 }) |
| 446 } |
446 } |
| 447 |
447 |
| 448 fn eval_ref_decompose<'b, 'c, R, F>(&'b self, f: F) -> R |
448 fn eval_ref_decompose<'c, R>( |
| |
449 &self, |
| |
450 f: impl FnOnce(Pair<D::Reference<'c>, Q::Reference<'c>>) -> R, |
| |
451 ) -> R |
| 449 where |
452 where |
| 450 Pair<A, B>: 'c, |
453 Pair<A, B>: 'c, |
| 451 Self: 'b, |
|
| 452 F: FnOnce(Pair<D::Reference<'c>, Q::Reference<'c>>) -> R, |
|
| 453 { |
454 { |
| 454 self.0 |
455 self.0 |
| 455 .eval_ref_decompose(|a| self.1.eval_ref_decompose(|b| f(Pair(a, b)))) |
456 .eval_ref_decompose(|a| self.1.eval_ref_decompose(|b| f(Pair(a, b)))) |
| 456 } |
457 } |
| 457 |
458 |