private void distributeTo(Batch <Venue> reached, Service provided[]) {
    //
    //  First, tabulate total supply and demand within the area-
    float
      supply[] = new float[provided.length],
      demand[] = new float[provided.length] ;
    for (Venue venue : reached) {
      for (int i = provided.length ; i-- > 0 ;) {
        final Service type = provided[i] ;
        supply[i] += venue.stocks.amountOf(type) ;
        final float shortage = venue.stocks.shortageOf(type) ;
        if (shortage > 0) demand[i] += shortage ;
      }
    }
    //
    //  Then top up demand in whole or in part, depending on how much supply
    //  is available-
    for (int i = provided.length ; i-- > 0 ;) {
      if (demand[i] == 0) continue ;
      final Service type = provided[i] ;
      final float supplyRatio = Visit.clamp(supply[i] / demand[i], 0, 1) ;
      for (Venue venue : reached) {
        final float shortage = venue.stocks.shortageOf(type) ;
        venue.stocks.bumpItem(type, shortage * supplyRatio) ;
      }
    }
  }