local function makeEnv(cond)
  return {
    -- I am doing this to get type hints!
    active = function()
      return cond
    end,
    not_active = function()
      return not cond()
    end,
    unless = function(f)
      if not cond() then
        f()
      end
    end,
    when = function(f)
      if cond() then
        f()
      end
    end,
  }
end

return {
  vscode = makeEnv(function()
    return vim.g.vscode ~= nil
  end),
  neovide = makeEnv(function()
    return vim.g.neovide ~= nil or require("nix.env") == "neovide"
  end),
  firenvim = makeEnv(function()
    return vim.g.started_by_firenvim ~= nil or require("nix.env") == "firenvim"
  end),
  _and = function(a, b)
    return makeEnv(function()
      return a.active() and b.active()
    end)
  end,
  _or = function(a, b)
    return makeEnv(function()
      return a.active() or b.active()
    end)
  end,
}