anchor.diff:              % -> just in case he was wrong, try to add it:
               contact_new_nodes([MyNewPred]),
               % try as long as MyNewPred is the same as PredsPred
  -            remove_pred(State2, MyNewPred, PredsPred)
  +            remove_pred_(State2, MyNewPred, PredsPred)
       end.
   
   -spec remove_succ(State::state(), OldSucc::node:node_type(),
  
positive.code: %%      occurred or was already determined, min_interval if chosen for the next
  %%      interval, otherwise max_interval. If the successor or predecessor
  %%      changes, the trigger will be called immediately.
  -spec update_nodes(State::state(),
                     NodesToAdd::[node:node_type()],
                     NodesToRemove::[node:node_type() | comm:mypid() | pid()],
                     RemoveNodeEvalFun::fun((node:node_type()) -> any()) | null)
          -> NewState::state().
  update_nodes(State, [], [], _RemoveNodeEvalFun) ->
      State;
  update_nodes({OldNeighborhood, RandViewSize, _Interval, TriggerState, OldCache, Churn},
  
negative.code: -spec remove_pred(State::state(), OldPred::node:node_type(),
                    PredsPred::node:node_type()) -> state().
  remove_pred(State, OldPred, PredsPred) ->
      remove_pred_(State, OldPred, PredsPred).
  
  -compile({inline, [remove_pred_/3]}).
  
  % private fun with non-opaque types to make dialyzer happy:
  -spec remove_pred_(State::state_t(), OldPred::node:node_type(),
                     PredsPred::node:node_type()) -> state_t().
  remove_pred_(State, OldPred, PredsPred) ->
      State2 = update_nodes(State, [PredsPred], [OldPred], null),
      % in order for incremental leaves to finish correctly, we must remove any
      % out-dated PredsPred in our state here!
  