///|
/// Identifier of a type within a `TypeSpace`.
pub(all) struct TypeId(Int) derive(Eq, Compare, Hash, Debug)

///|
pub impl Show for TypeId with fn output(self, logger) {
  logger.write_string("TypeId(\{self.0})")
}

///|
/// A name for a type being converted.
pub(all) enum Name {
  /// The name must be used (a named definition).
  Required(String)
  /// A hint for a name; the schema title takes precedence.
  Suggested(String)
  Unknown
} derive(Eq, Debug)

///|
pub fn Name::into_option(self : Name) -> String? {
  match self {
    Required(s) | Suggested(s) => Some(s)
    Unknown => None
  }
}

///|
/// Derive a suggested sub-name: `prefix_s`.
pub fn Name::append(self : Name, s : String) -> Name {
  match self {
    Required(prefix) | Suggested(prefix) => Suggested("\{prefix}_\{s}")
    Unknown => Unknown
  }
}

///|
/// A key for referenceable schemas: the root or a named definition.
pub(all) enum RefKey {
  Root
  Def(String)
} derive(Eq, Hash, Debug)