///|
priv struct WindowImageTaskEntry {
  id : @backend_host.WindowId
  tasks : WindowImageTasks
}

///|
pub struct WindowImageTaskStates {
  priv mut entries : Array[WindowImageTaskEntry]
}

///|
pub fn WindowImageTaskStates::new() -> WindowImageTaskStates {
  { entries: [], }
}

///|
pub fn WindowImageTaskStates::attach(
  self : WindowImageTaskStates,
  id : @backend_host.WindowId,
  starter? : WindowImageTaskStarter = WindowImageTaskStarter::immediate(),
  request_redraw~ : () -> Unit,
) -> Bool {
  if self.lookup(id) is Some(_) {
    return false
  }
  self.entries.push({
    id,
    tasks: WindowImageTasks::new(starter~, request_redraw~),
  })
  true
}

///|
pub fn WindowImageTaskStates::lookup(
  self : WindowImageTaskStates,
  id : @backend_host.WindowId,
) -> WindowImageTasks? {
  for entry in self.entries {
    if entry.id == id {
      return Some(entry.tasks)
    }
  }
  None
}

///|
pub fn WindowImageTaskStates::remove(
  self : WindowImageTaskStates,
  id : @backend_host.WindowId,
) -> WindowImageTasks? {
  let mut removed = None
  let kept : Array[WindowImageTaskEntry] = []
  for entry in self.entries {
    if entry.id == id {
      removed = Some(entry.tasks)
    } else {
      kept.push(entry)
    }
  }
  self.entries = kept
  removed
}

///|
pub fn WindowImageTaskStates::dispose_window(
  self : WindowImageTaskStates,
  id : @backend_host.WindowId,
) -> Bool {
  match self.remove(id) {
    Some(tasks) => {
      tasks.dispose()
      true
    }
    None => false
  }
}

///|
pub fn WindowImageTaskStates::count(self : WindowImageTaskStates) -> Int {
  self.entries.length()
}