///|
pub fn ImageResourceLifecycle::mark_loading(
  self : ImageResourceLifecycle,
  source : String,
) -> Bool {
  self.store_record(@render.ImageResourceRecord::loading(source))
}

///|
pub fn ImageResourceLifecycle::mark_ready(
  self : ImageResourceLifecycle,
  source : String,
  width~ : Int,
  height~ : Int,
) -> Bool {
  self.store_record(@render.ImageResourceRecord::ready(source, width~, height~))
}

///|
pub fn ImageResourceLifecycle::mark_failed(
  self : ImageResourceLifecycle,
  source : String,
  diagnostic~ : String,
) -> Bool {
  self.store_record(@render.ImageResourceRecord::failed(source, diagnostic~))
}

///|
pub fn ImageResourceLifecycle::dispose(
  self : ImageResourceLifecycle,
  source : String,
) -> Bool {
  self.store_record(@render.ImageResourceRecord::disposed(source))
}

///|
fn ImageResourceLifecycle::store_record(
  self : ImageResourceLifecycle,
  record : @render.ImageResourceRecord,
) -> Bool {
  match self.records.get(record.source) {
    Some(existing) =>
      if existing != record {
        self.records[record.source] = record
        true
      } else {
        false
      }
    None => {
      self.records[record.source] = record
      true
    }
  }
}

///|
pub fn ImageResourceLifecycle::evict_disposed(
  self : ImageResourceLifecycle,
) -> Int {
  let mut removed = 0
  let kept : Map[String, @render.ImageResourceRecord] = Map([])
  for key, record in self.records {
    if record.status == ImageDisposed {
      removed = removed + 1
    } else {
      kept[key] = record
    }
  }
  self.records = kept
  removed
}