code: def write_union(fo, datum, schema):
      
  
      if isinstance(datum, tuple):
          (name, datum) = datum
          for index, candidate in enumerate(schema):
              if extract_record_type(candidate) == 'record':
                  schema_name = candidate['name']
              else:
                  schema_name = candidate
              if name == schema_name:
                  break
          else:
              msg = 'provided union type name %s not found in schema %s' \
                % (name, schema)
              raise ValueError(msg)
      else:
          pytype = type(datum)
          best_match_index = -1
          most_fields = -1
          for index, candidate in enumerate(schema):
              if validate(datum, candidate, raise_errors=False):
                  if extract_record_type(candidate) == 'record':
                      fields = len(candidate['fields'])
                      if fields > most_fields:
                          best_match_index = index
                          most_fields = fields
                  else:
                      best_match_index = index
                      break
          if best_match_index < 0:
              msg = '%r (type %s) do not match %s' % (datum, pytype, schema)
              raise ValueError(msg)
          index = best_match_index
  
      # write data
      write_long(fo, index)
      write_data(fo, datum, schema[index])
docs: A union is encoded by first writing a long value indicating the
      zero-based position within the union of the schema of its value. The value
      is then encoded per the indicated schema within the union.