@@ -0,0 +1,75 @@
1+module Effectful.Environment
2+ ( -- * Environment effect
3+ Environment
4+ , runEnvironment
5+
6+ -- * Querying the environment
7+ , getArgs
8+ , getProgName
9+ , getExecutablePath
10+ , getEnv
11+ , getEnvironment
12+ , lookupEnv
13+
14+ -- * Modifying the environment
15+ , setEnv
16+ , unsetEnv
17+ , withArgs
18+ , withProgName
19+ ) where
20+
21+import qualified System.Environment as E
22+
23+import Effectful.Internal.Effect
24+import Effectful.Internal.Monad
25+
26+-- | An effect for querying and modifying the system environment.
27+data Environment :: Effect where
28+ Environment :: Environment m r
29+
30+runEnvironment :: IOE :> es => Eff (Environment : es) a -> Eff es a
31+runEnvironment = evalEffect (IdE Environment)
32+
33+-- | Lifted 'E.getArgs'.
34+getArgs :: Environment :> es => Eff es [String]
35+getArgs = unsafeEff_ E.getArgs
36+
37+-- | Lifted 'E.getEnv'.
38+getEnv :: Environment :> es => String -> Eff es String
39+getEnv = unsafeEff_ . E.getEnv
40+
41+-- | Lifted 'E.getEnvironment'.
42+getEnvironment :: Environment :> es => Eff es [(String, String)]
43+getEnvironment = unsafeEff_ E.getEnvironment
44+
45+-- | Lifted 'E.getExecutablePath'.
46+getExecutablePath :: Environment :> es => Eff es FilePath
47+getExecutablePath = unsafeEff_ E.getExecutablePath
48+
49+-- | Lifted 'E.getProgName'.
50+getProgName :: Environment :> es => Eff es String
51+getProgName = unsafeEff_ E.getProgName
52+
53+-- | Lifted 'E.lookupEnv'.
54+lookupEnv :: Environment :> es => String -> Eff es (Maybe String)
55+lookupEnv = unsafeEff_ . E.lookupEnv
56+
57+-- | Lifted 'E.setEnv'.
58+setEnv :: Environment :> es => String -> String -> Eff es ()
59+setEnv n = unsafeEff_ . E.setEnv n
60+
61+-- | Lifted 'E.unsetEnv'.
62+unsetEnv :: Environment :> es => String -> Eff es ()
63+unsetEnv = unsafeEff_ . E.unsetEnv
64+
65+-- | Lifted 'E.withArgs'.
66+withArgs :: Environment :> es => [String] -> Eff es a -> Eff es a
67+withArgs env k = unsafeEff $ \es -> do
68+ seqUnliftEff es $ \runInIO -> do
69+ E.withArgs env (runInIO k)
70+
71+-- | Lifted 'E.withProgName'.
72+withProgName :: Environment :> es => String -> Eff es a -> Eff es a
73+withProgName n k = unsafeEff $ \es -> do
74+ seqUnliftEff es $ \runInIO -> do
75+ E.withProgName n (runInIO k)