pub fn translate_type_with<Id, T, U, I, F>(
    interner: &mut I,
    typ: &Type<Id, T>,
    translate: F
) -> U
where T: TypePtr<Id = Id>, U: TypePtr<Id = Id>, Id: Clone, T::SpannedId: Into<U::SpannedId> + Clone, F: FnMut(&mut I, &T) -> U, I: TypeContext<Id, U>,