///|
pub struct EnvProvider {
  get : (String) -> String?
  current_dir : () -> String?
}

///|
pub fn EnvProvider::new(
  get : (String) -> String?,
  current_dir : () -> String?,
) -> EnvProvider {
  { get, current_dir }
}

///|
pub fn EnvProvider::none() -> EnvProvider {
  { get: fn(_ : String) { None }, current_dir: () => None }
}

///|
priv struct EnvProviderBox {
  mut value : EnvProvider
}

///|
let env_provider_box : EnvProviderBox = { value: EnvProvider::none() }

///|
pub fn set_env_provider(provider : EnvProvider) -> Unit {
  env_provider_box.value = provider
}

///|
pub fn env_get(name : String) -> String? {
  (env_provider_box.value.get)(name)
}

///|
pub fn env_current_dir() -> String? {
  (env_provider_box.value.current_dir)()
}