def METHOD_NAME(
    client_data, client_dataset_size: int, shuffle_buffer_size: int = 10000
):
  """Constructs an iterable of IID clients from a `tff.simulation.datasets.ClientData`.
  The returned iterator yields a stream of `tf.data.Datsets` that approximates
  the true statistical IID setting with the entirety of `client_data`
  representing the global distribution. That is, we do not simply randomly
  distribute the data across some fixed number of clients, instead each dataset
  returned by the iterator samples independently from the entirety of
  `client_data` (so any example in `client_data` may be produced by any client).
  Args:
    client_data: A `tff.simulation.datasets.ClientData`.
    client_dataset_size: The size of the `tf.data.Dataset` to yield from the
      returned dataset.
    shuffle_buffer_size: Shuffling buffer size for the union of all data from
      input `client_data`.
  Returns:
    A `tf.data.Dataset` instance that yields iid client datasets sampled from
    the global distribution.
  """
  global_dataset = client_data.create_tf_dataset_from_all_clients()
  global_dataset = global_dataset.shuffle(
      buffer_size=shuffle_buffer_size, reshuffle_each_iteration=True
  )
  global_dataset = global_dataset.repeat(None)  # Repeat forever
  return global_dataset.window(client_dataset_size)