docs: def write(models, csvout, rulelist, write_header, base=None, logger=logging):
      '''
      models - one or more input Versa models from which output is generated.
      '''
      properties = [ k for (k, v) in rulelist ]
      numprops = len(properties)
      headers = [ v for (k, v) in rulelist ]
      if write_header:
          csvout.writerow(['id', 'type'] + headers)
  
      rules = { k: v for (k, v) in rulelist }
  
      if not isinstance(models, list): models = [models]
      for m in models:
          mapped = omap(m)
          for o, props in mapped.items():
              rtypes = list(map(operator.itemgetter(0), props.get(RDF_TYPE_REL, [])))
              if not rtypes: continue
              #print('RES TYPES:', rtypes)
              row = [o, fromlist(rtypes)] + [None] * numprops
              for ix, p in enumerate(properties):
                  v = list(map(operator.itemgetter(0), props.get(p, [])))
                  if v:
                      row[ix + 2] = fromlist(v)
                      csvout.writerow(row)
  
      return