module HaskellWorks.Polysemy.System.Environment
  ( getArgs,
    getProgName,
    executablePath,
    getExecutablePath,
    getEnv,
    lookupEnv,
    setEnv,
    unsetEnv,
    getEnvironment,
  ) where

import qualified Control.Exception             as CE
import           HaskellWorks.Polysemy.Prelude
import           Polysemy
import           Polysemy.Error
import qualified System.Environment            as IO

getArgs :: ()
  => HasCallStack
  => Member (Embed IO) r
  => Sem r [String]
getArgs :: forall (r :: EffectRow).
(HasCallStack, Member (Embed IO) r) =>
Sem r [String]
getArgs = (HasCallStack => Sem r [String]) -> Sem r [String]
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack ((HasCallStack => Sem r [String]) -> Sem r [String])
-> (HasCallStack => Sem r [String]) -> Sem r [String]
forall a b. (a -> b) -> a -> b
$
  IO [String] -> Sem r [String]
forall (m :: * -> *) (r :: EffectRow) a.
Member (Embed m) r =>
m a -> Sem r a
embed IO [String]
IO.getArgs

getProgName :: ()
  => HasCallStack
  => Member (Embed IO) r
  => Sem r String
getProgName :: forall (r :: EffectRow).
(HasCallStack, Member (Embed IO) r) =>
Sem r String
getProgName = (HasCallStack => Sem r String) -> Sem r String
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack ((HasCallStack => Sem r String) -> Sem r String)
-> (HasCallStack => Sem r String) -> Sem r String
forall a b. (a -> b) -> a -> b
$
  IO String -> Sem r String
forall (m :: * -> *) (r :: EffectRow) a.
Member (Embed m) r =>
m a -> Sem r a
embed IO String
IO.getProgName

executablePath :: ()
  => HasCallStack
  => Member (Embed IO) r
  => Maybe (Sem r (Maybe FilePath))
executablePath :: forall (r :: EffectRow).
(HasCallStack, Member (Embed IO) r) =>
Maybe (Sem r (Maybe String))
executablePath = (HasCallStack => Maybe (Sem r (Maybe String)))
-> Maybe (Sem r (Maybe String))
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack ((HasCallStack => Maybe (Sem r (Maybe String)))
 -> Maybe (Sem r (Maybe String)))
-> (HasCallStack => Maybe (Sem r (Maybe String)))
-> Maybe (Sem r (Maybe String))
forall a b. (a -> b) -> a -> b
$
  IO (Maybe String) -> Sem r (Maybe String)
forall (m :: * -> *) (r :: EffectRow) a.
Member (Embed m) r =>
m a -> Sem r a
embed (IO (Maybe String) -> Sem r (Maybe String))
-> Maybe (IO (Maybe String)) -> Maybe (Sem r (Maybe String))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (IO (Maybe String))
IO.executablePath

getExecutablePath :: ()
  => HasCallStack
  => Member (Embed IO) r
  => Sem r String
getExecutablePath :: forall (r :: EffectRow).
(HasCallStack, Member (Embed IO) r) =>
Sem r String
getExecutablePath = (HasCallStack => Sem r String) -> Sem r String
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack ((HasCallStack => Sem r String) -> Sem r String)
-> (HasCallStack => Sem r String) -> Sem r String
forall a b. (a -> b) -> a -> b
$
  IO String -> Sem r String
forall (m :: * -> *) (r :: EffectRow) a.
Member (Embed m) r =>
m a -> Sem r a
embed IO String
IO.getExecutablePath

getEnv :: ()
  => HasCallStack
  => Member (Embed IO) r
  => Member (Error IOException) r
  => String
  -> Sem r String
getEnv :: forall (r :: EffectRow).
(HasCallStack, Member (Embed IO) r,
 Member (Error IOException) r) =>
String -> Sem r String
getEnv String
name = (HasCallStack => Sem r String) -> Sem r String
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack ((HasCallStack => Sem r String) -> Sem r String)
-> (HasCallStack => Sem r String) -> Sem r String
forall a b. (a -> b) -> a -> b
$ do
  Either IOException String
r <- IO (Either IOException String) -> Sem r (Either IOException String)
forall (m :: * -> *) (r :: EffectRow) a.
Member (Embed m) r =>
m a -> Sem r a
embed (IO (Either IOException String)
 -> Sem r (Either IOException String))
-> IO (Either IOException String)
-> Sem r (Either IOException String)
forall a b. (a -> b) -> a -> b
$ forall e a. Exception e => IO a -> IO (Either e a)
CE.try @IOException (IO String -> IO (Either IOException String))
-> IO String -> IO (Either IOException String)
forall a b. (a -> b) -> a -> b
$ String -> IO String
IO.getEnv String
name
  Either IOException String -> Sem r String
forall e (r :: EffectRow) a.
Member (Error e) r =>
Either e a -> Sem r a
fromEither Either IOException String
r

lookupEnv :: ()
  => HasCallStack
  => Member (Embed IO) r
  => String
  -> Sem r (Maybe String)
lookupEnv :: forall (r :: EffectRow).
(HasCallStack, Member (Embed IO) r) =>
String -> Sem r (Maybe String)
lookupEnv String
name = (HasCallStack => Sem r (Maybe String)) -> Sem r (Maybe String)
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack ((HasCallStack => Sem r (Maybe String)) -> Sem r (Maybe String))
-> (HasCallStack => Sem r (Maybe String)) -> Sem r (Maybe String)
forall a b. (a -> b) -> a -> b
$
  IO (Maybe String) -> Sem r (Maybe String)
forall (m :: * -> *) (r :: EffectRow) a.
Member (Embed m) r =>
m a -> Sem r a
embed (IO (Maybe String) -> Sem r (Maybe String))
-> IO (Maybe String) -> Sem r (Maybe String)
forall a b. (a -> b) -> a -> b
$ String -> IO (Maybe String)
IO.lookupEnv String
name

setEnv :: ()
  => HasCallStack
  => Member (Error IOException) r
  => Member (Embed IO) r
  => String
  -> String
  -> Sem r ()
setEnv :: forall (r :: EffectRow).
(HasCallStack, Member (Error IOException) r,
 Member (Embed IO) r) =>
String -> String -> Sem r ()
setEnv String
name String
value = (HasCallStack => Sem r ()) -> Sem r ()
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack ((HasCallStack => Sem r ()) -> Sem r ())
-> (HasCallStack => Sem r ()) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ do
  Either IOException ()
r <- IO (Either IOException ()) -> Sem r (Either IOException ())
forall (m :: * -> *) (r :: EffectRow) a.
Member (Embed m) r =>
m a -> Sem r a
embed (IO (Either IOException ()) -> Sem r (Either IOException ()))
-> IO (Either IOException ()) -> Sem r (Either IOException ())
forall a b. (a -> b) -> a -> b
$ forall e a. Exception e => IO a -> IO (Either e a)
CE.try @IOException (IO () -> IO (Either IOException ()))
-> IO () -> IO (Either IOException ())
forall a b. (a -> b) -> a -> b
$ String -> String -> IO ()
IO.setEnv String
name String
value
  Either IOException () -> Sem r ()
forall e (r :: EffectRow) a.
Member (Error e) r =>
Either e a -> Sem r a
fromEither Either IOException ()
r

unsetEnv :: ()
  => HasCallStack
  => Member (Error IOException) r
  => Member (Embed IO) r
  => String
  -> Sem r ()
unsetEnv :: forall (r :: EffectRow).
(HasCallStack, Member (Error IOException) r,
 Member (Embed IO) r) =>
String -> Sem r ()
unsetEnv String
name = (HasCallStack => Sem r ()) -> Sem r ()
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack ((HasCallStack => Sem r ()) -> Sem r ())
-> (HasCallStack => Sem r ()) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ do
  Either IOException ()
r <- IO (Either IOException ()) -> Sem r (Either IOException ())
forall (m :: * -> *) (r :: EffectRow) a.
Member (Embed m) r =>
m a -> Sem r a
embed (IO (Either IOException ()) -> Sem r (Either IOException ()))
-> IO (Either IOException ()) -> Sem r (Either IOException ())
forall a b. (a -> b) -> a -> b
$ forall e a. Exception e => IO a -> IO (Either e a)
CE.try @IOException (IO () -> IO (Either IOException ()))
-> IO () -> IO (Either IOException ())
forall a b. (a -> b) -> a -> b
$ String -> IO ()
IO.unsetEnv String
name
  Either IOException () -> Sem r ()
forall e (r :: EffectRow) a.
Member (Error e) r =>
Either e a -> Sem r a
fromEither Either IOException ()
r

getEnvironment :: ()
  => HasCallStack
  => Member (Embed IO) r
  => Sem r [(String, String)]
getEnvironment :: forall (r :: EffectRow).
(HasCallStack, Member (Embed IO) r) =>
Sem r [(String, String)]
getEnvironment = (HasCallStack => Sem r [(String, String)])
-> Sem r [(String, String)]
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack ((HasCallStack => Sem r [(String, String)])
 -> Sem r [(String, String)])
-> (HasCallStack => Sem r [(String, String)])
-> Sem r [(String, String)]
forall a b. (a -> b) -> a -> b
$
  IO [(String, String)] -> Sem r [(String, String)]
forall (m :: * -> *) (r :: EffectRow) a.
Member (Embed m) r =>
m a -> Sem r a
embed IO [(String, String)]
IO.getEnvironment