///|
pub struct SourceRegistry {
  entries : Array[DataSource]
} derive(Debug, Eq)

///|
pub fn source_registry() -> SourceRegistry {
  { entries: [] }
}

///|
pub fn SourceRegistry::add(
  self : SourceRegistry,
  value : DataSource,
) -> SourceRegistry {
  for index, existing in self.entries {
    if existing.citation == value.citation {
      if existing.url == "" && value.url != "" {
        self.entries[index] = value
      }
      return self
    }
  }
  self.entries.push(value)
  self
}

///|
pub fn SourceRegistry::add_all(
  self : SourceRegistry,
  values : Array[DataSource],
) -> SourceRegistry {
  let mut current = self
  for value in values {
    current = current.add(value)
  }
  current
}

///|
pub fn SourceRegistry::sources(self : SourceRegistry) -> Array[DataSource] {
  self.entries.copy()
}

///|
pub fn SourceRegistry::has_url(self : SourceRegistry, url : String) -> Bool {
  for value in self.entries {
    if value.url == url {
      break true
    }
  } nobreak {
    false
  }
}

///|
pub fn SourceRegistry::to_markdown(self : SourceRegistry) -> String {
  let lines : Array[String] = []
  for value in self.entries {
    let url = if value.url == "" { "" } else { " (\{value.url})" }
    lines.push("- **\{value.label}**: \{value.citation}\{url}")
  }
  lines.join("\n")
}