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