code: def read_union(fo, writer_schema, reader_schema=None):
      
      # schema resolution
      index = read_long(fo)
      if reader_schema:
          # Handle case where the reader schema is just a single type (not union)
          if not isinstance(reader_schema, list):
              if match_types(writer_schema[index], reader_schema):
                  return read_data(fo, writer_schema[index], reader_schema)
          else:
              for schema in reader_schema:
                  if match_types(writer_schema[index], schema):
                      return read_data(fo, writer_schema[index], schema)
          msg = 'schema mismatch: %s not found in %s' % \
              (writer_schema, reader_schema)
          raise SchemaResolutionError(msg)
      else:
          return read_data(fo, writer_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.