///|
pub fn would_create_cycle(
  issues : Array[Issue],
  child : String,
  parent : String,
) -> Bool {
  if child == parent {
    return true
  }
  let graph = build_dep_map(issues)
  has_path(graph, parent, child, {})
}

///|
pub fn remove_dep_value(deps : Array[String], target : String) -> Array[String] {
  deps.filter(dep => dep != target)
}

///|
fn build_dep_map(issues : Array[Issue]) -> Map[String, Array[String]] {
  let map = {}
  for issue in issues {
    map[issue.id] = issue.deps
  }
  map
}

///|
fn has_path(
  graph : Map[String, Array[String]],
  current : String,
  target : String,
  visited : Map[String, Bool],
) -> Bool {
  if current == target {
    return true
  }
  match visited.get(current) {
    Some(true) => return false
    _ => ()
  }
  visited[current] = true
  match graph.get(current) {
    Some(deps) =>
      for dep in deps {
        if has_path(graph, dep, target, visited) {
          return true
        }
      }
    None => ()
  }
  false
}