pub fn recalculate_occultation_general<RD, LD, VF, LF, RF>(
    gen: &mut UniqueGenGen<'_>,
    gplayers: &DenseSlotMap<PlayerId, GPlayer>,
    gpieces: &mut GPieces,
    goccults: &mut GOccults,
    ipieces: &IPieces,
    ioccults: &IOccults,
    to_recalculate: &mut ToRecalculate,
    piece: PieceId,
    ret_vanilla: VF,
    log_invisible: LD,
    log_callback: LF,
    ret_callback: RF
) -> Result<RD, InternalError> where
    RD: Debug,
    LD: Debug,
    VF: FnOnce() -> RD,
    LF: for<'_> FnOnce(Option<Html>, Option<Html>, &Html) -> LD,
    RF: FnOnce(SecondaryMap<PlayerId, PieceUpdateOp<(), ()>>, LD) -> RD,