pub fn translate_type_with<Id, T, U, F>(
    cache: &TypeCache<Id, U>,
    typ: &Type<Id, T>,
    translate: F
) -> Uwhere
    T: Deref<Target = Type<Id, T>>,
    U: From<Type<Id, U>> + Clone,
    Id: Clone,
    F: FnMut(&T) -> U,