1{- portable environment variables
2 -
3 - Copyright 2013 Joey Hess <id@joeyh.name>
4 -
5 - License: BSD-2-clause
6 -}
7
8{-# LANGUAGE CPP #-}
9{-# OPTIONS_GHC -fno-warn-tabs #-}
10
11module Utility.Env (
12	getEnv,
13	getEnvDefault,
14	getEnvironment,
15	addEntry,
16	addEntries,
17	delEntry,
18) where
19
20#ifdef mingw32_HOST_OS
21import Utility.Exception
22import Control.Applicative
23import Data.Maybe
24import Prelude
25import qualified System.Environment as E
26#else
27import qualified System.Posix.Env as PE
28#endif
29
30getEnv :: String -> IO (Maybe String)
31#ifndef mingw32_HOST_OS
32getEnv = PE.getEnv
33#else
34getEnv = catchMaybeIO . E.getEnv
35#endif
36
37getEnvDefault :: String -> String -> IO String
38#ifndef mingw32_HOST_OS
39getEnvDefault = PE.getEnvDefault
40#else
41getEnvDefault var fallback = fromMaybe fallback <$> getEnv var
42#endif
43
44getEnvironment :: IO [(String, String)]
45#ifndef mingw32_HOST_OS
46getEnvironment = PE.getEnvironment
47#else
48getEnvironment = E.getEnvironment
49#endif
50
51{- Adds the environment variable to the input environment. If already
52 - present in the list, removes the old value.
53 -
54 - This does not really belong here, but Data.AssocList is for some reason
55 - buried inside hxt.
56 -}
57addEntry :: Eq k => k -> v -> [(k, v)] -> [(k, v)]
58addEntry k v l = ( (k,v) : ) $! delEntry k l
59
60addEntries :: Eq k => [(k, v)] -> [(k, v)] -> [(k, v)]
61addEntries = foldr (.) id . map (uncurry addEntry) . reverse
62
63delEntry :: Eq k => k -> [(k, v)] -> [(k, v)]
64delEntry _ []   = []
65delEntry k (x@(k1,_) : rest)
66	| k == k1 = rest
67	| otherwise = ( x : ) $! delEntry k rest
68