anchor.diff:  throttle(Bin, #transport{throttled = Msg} = S)
     when is_binary(Bin), is_binary(Msg) ->
       send(Bin, S),
  -    throttle(S#transport{throttled = true});
  +    S;
   
   throttle({Bin, F}, #transport{throttled = Msg} = S)
     when is_binary(Bin), is_binary(Msg) ->
       throttle(Bin, S#transport{throttle_cb = F});
   
   %% Callback says to ask again in the specified number of milliseconds.
  -throttle({timeout, Tmo}, #transport{} = S) ->
  +throttle({timeout, Tmo}, S) ->
       erlang:send_after(Tmo, self(), throttle),
  -    S;
  +    throw(S);
   
   throttle({timeout = T, Tmo, F}, S) ->
       throttle({T, Tmo}, S#transport{throttle_cb = F});
   
   throttle(T, #transport{throttle_cb = F}) ->
       ?ERROR({invalid_return, T, F}).
  +
  +%% defrag/1
  +%%
  +%% Try to extract another message from packets already read before
  +%% another throttling callback.
  +
  +defrag(#transport{frag = Head} = S) ->
  +    case rcv(Head, <<>>) of
  +        {Msg, B} ->
  +            S#transport{throttled = Msg, frag = B};
  +        _ ->
  +            S#transport{throttled = true}
  +    end.
   
   %% portnr/2
   
  
positive.code: %% Callback to accept a received message says to discard it.
  throttle(discard, #transport{throttled = Msg} = S)
    when is_binary(Msg) ->
      throttle(S#transport{throttled = true});
  
  throttle({discard = T, F}, #transport{throttled = Msg} = S)
    when is_binary(Msg) ->
  
negative.code:     recv(S);
  
  throttle(#transport{throttle_cb = F, throttled = B} = S) ->
      Res = cb(F, B),
  
      try throttle(Res, S) of
          #transport{} = NS ->
              throttle(defrag(NS))
      catch
          #transport{throttled = false} = NS ->
              recv(NS);
          #transport{} = NS ->
              NS
      end.
  
  %% cb/2
  
  