///|
/// Resolves a named directory using the supplied environment snapshot.
fn dir_for_env(kind : String, envs : Map[String, String]) -> String? {
  match kind {
    "home" => home_dir_for_env(envs)
    "cache" => cache_dir_for_env(envs)
    "config" => config_dir_for_env(envs)
    "executable" => executable_dir_for_env(envs)
    "data" => data_dir_for_env(envs)
    "data_local" => data_local_dir_for_env(envs)
    "audio" => audio_dir_for_env(envs)
    "desktop" => desktop_dir_for_env(envs)
    "document" => document_dir_for_env(envs)
    "download" => download_dir_for_env(envs)
    "font" => font_dir_for_env(envs)
    "picture" => picture_dir_for_env(envs)
    "public" => public_dir_for_env(envs)
    "template" => template_dir_for_env(envs)
    "tmp" => tmp_dir_for_env(envs)
    "video" => video_dir_for_env(envs)
    _ => None
  }
}

///|
/// Joins two path segments with the official platform-specific path implementation.
#cfg(all(target="native", platform="windows"))
fn join_path(base : String, child : String) -> String {
  @win32.Path::join(base, child).to_string()
}

///|
/// Joins two path segments with the official platform-specific path implementation.
#cfg(not(all(target="native", platform="windows")))
fn join_path(base : String, child : String) -> String {
  @posix.Path::join(base, child).to_string()
}

///|
fn _path_imports() -> Unit {
  let _ = @posix.sep
  let _ = @win32.sep
}

///|
/// Normalizes a path using the official platform-specific path implementation.
#cfg(all(target="native", platform="windows"))
fn _normalize_path(path : String) -> String {
  @win32.Path::normalize(path).to_string()
}

///|
/// Normalizes a path using the official platform-specific path implementation.
#cfg(not(all(target="native", platform="windows")))
fn _normalize_path(path : String) -> String {
  @posix.Path::normalize(path).to_string()
}

///|
/// Joins HOMEDRIVE and HOMEPATH when USERPROFILE is unavailable.
fn _home_drive_path(envs : Map[String, String]) -> String? {
  match (env_value(envs, "HOMEDRIVE"), env_value(envs, "HOMEPATH")) {
    (Some(drive), Some(path)) => Some("\{drive}\{path}")
    _ => None
  }
}

///|
/// Resolves a home-relative directory by name.
fn home_named_dir_for_env(envs : Map[String, String], name : String) -> String? {
  match home_dir_for_env(envs) {
    Some(home) => Some(join_path(home, name))
    None => None
  }
}

///|
/// Resolves an XDG-style user directory with a conventional home fallback.
fn _user_dir_for_env(
  envs : Map[String, String],
  env_key : String,
  fallback_name : String,
) -> String? {
  match env_value(envs, env_key) {
    Some(path) => Some(path)
    None => home_named_dir_for_env(envs, fallback_name)
  }
}