1 //! This module contains impls of `Fold` for those types that
4 //! The more interesting impls of `Fold` remain in the `fold` module.
6 use crate::interner
::TargetInterner
;
9 impl<I
: Interner
, TI
: TargetInterner
<I
>> Fold
<I
, TI
> for FnPointer
<I
> {
10 type Result
= FnPointer
<TI
>;
13 folder
: &mut dyn Folder
<'i
, I
, TI
>,
14 outer_binder
: DebruijnIndex
,
15 ) -> Fallible
<Self::Result
>
26 num_binders
: *num_binders
,
27 substitution
: substitution
.fold_with(folder
, outer_binder
.shifted_in())?
,
29 abi
: TI
::transfer_abi(sig
.abi
),
31 variadic
: sig
.variadic
,
37 impl<T
, I
: Interner
, TI
: TargetInterner
<I
>> Fold
<I
, TI
> for Binders
<T
>
39 T
: HasInterner
<Interner
= I
> + Fold
<I
, TI
>,
40 <T
as Fold
<I
, TI
>>::Result
: HasInterner
<Interner
= TI
>,
43 type Result
= Binders
<T
::Result
>;
46 folder
: &mut dyn Folder
<'i
, I
, TI
>,
47 outer_binder
: DebruijnIndex
,
48 ) -> Fallible
<Self::Result
>
54 binders
: self_binders
,
57 let value
= self_value
.fold_with(folder
, outer_binder
.shifted_in())?
;
58 let binders
= VariableKinds
{
59 interned
: TI
::transfer_variable_kinds(self_binders
.interned().clone()),
61 Ok(Binders
::new(binders
, value
))
65 impl<I
, T
, TI
> Fold
<I
, TI
> for Canonical
<T
>
68 T
: HasInterner
<Interner
= I
> + Fold
<I
, TI
>,
69 <T
as Fold
<I
, TI
>>::Result
: HasInterner
<Interner
= TI
>,
70 TI
: TargetInterner
<I
>,
72 type Result
= Canonical
<T
::Result
>;
75 folder
: &mut dyn Folder
<'i
, I
, TI
>,
76 outer_binder
: DebruijnIndex
,
77 ) -> Fallible
<Self::Result
>
83 binders
: self_binders
,
86 let value
= self_value
.fold_with(folder
, outer_binder
.shifted_in())?
;
87 let binders
= CanonicalVarKinds
{
88 interned
: TI
::transfer_canonical_var_kinds(self_binders
.interned().clone()),
90 Ok(Canonical { binders, value }
)