{-# LANGUAGE LambdaCase #-}
module System.Environment.Guard.Lifted
(
ExpectEnv (..),
withGuard,
withGuard_,
guardOrElse,
guardOrElse',
guardSet,
guardSet_,
guardExpected,
guardExpected_,
guardPredicate,
guardPredicate_,
)
where
import Control.Monad (void)
import Control.Monad.IO.Class (MonadIO (..))
import Data.Char (toLower)
import System.Environment (lookupEnv)
data ExpectEnv
=
ExpectEnvSet
|
ExpectEnvEquals String
|
ExpectEnvPredicate (String -> Bool)
instance Show ExpectEnv where
showsPrec :: Int -> ExpectEnv -> ShowS
showsPrec Int
_ ExpectEnv
ExpectEnvSet = [Char] -> ShowS
showString [Char]
"ExpectEnvSet"
showsPrec Int
i (ExpectEnvEquals [Char]
s) =
Bool -> ShowS -> ShowS
showParen
(Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
11)
([Char] -> ShowS
showString [Char]
"ExpectEnvEquals " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [Char] -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 [Char]
s)
showsPrec Int
i (ExpectEnvPredicate [Char] -> Bool
_) =
Bool -> ShowS -> ShowS
showParen
(Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
11)
([Char] -> ShowS
showString [Char]
"ExpectEnvEquals " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> ShowS
showString [Char]
"_")
withGuard :: MonadIO m => String -> ExpectEnv -> m a -> m (Maybe a)
withGuard :: forall (m :: * -> *) a.
MonadIO m =>
[Char] -> ExpectEnv -> m a -> m (Maybe a)
withGuard [Char]
var ExpectEnv
expect m a
m =
case ExpectEnv
expect of
ExpectEnv
ExpectEnvSet -> [Char] -> m a -> m (Maybe a)
forall (m :: * -> *) a. MonadIO m => [Char] -> m a -> m (Maybe a)
guardSet [Char]
var m a
m
ExpectEnvEquals [Char]
str -> [Char] -> [Char] -> m a -> m (Maybe a)
forall (m :: * -> *) a.
MonadIO m =>
[Char] -> [Char] -> m a -> m (Maybe a)
guardExpected [Char]
var [Char]
str m a
m
ExpectEnvPredicate [Char] -> Bool
p -> [Char] -> ([Char] -> Bool) -> m a -> m (Maybe a)
forall (m :: * -> *) a.
MonadIO m =>
[Char] -> ([Char] -> Bool) -> m a -> m (Maybe a)
guardPredicate [Char]
var [Char] -> Bool
p m a
m
withGuard_ :: MonadIO m => String -> ExpectEnv -> m a -> m ()
withGuard_ :: forall (m :: * -> *) a.
MonadIO m =>
[Char] -> ExpectEnv -> m a -> m ()
withGuard_ [Char]
var ExpectEnv
expect = m (Maybe a) -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m (Maybe a) -> m ()) -> (m a -> m (Maybe a)) -> m a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> ExpectEnv -> m a -> m (Maybe a)
forall (m :: * -> *) a.
MonadIO m =>
[Char] -> ExpectEnv -> m a -> m (Maybe a)
withGuard [Char]
var ExpectEnv
expect
guardOrElse ::
MonadIO m =>
String ->
ExpectEnv ->
m a ->
m e ->
m (Either e a)
guardOrElse :: forall (m :: * -> *) a e.
MonadIO m =>
[Char] -> ExpectEnv -> m a -> m e -> m (Either e a)
guardOrElse [Char]
var ExpectEnv
expect m a
m1 m e
m2 =
[Char] -> ExpectEnv -> m a -> m (Maybe a)
forall (m :: * -> *) a.
MonadIO m =>
[Char] -> ExpectEnv -> m a -> m (Maybe a)
withGuard [Char]
var ExpectEnv
expect m a
m1
m (Maybe a) -> (Maybe a -> m (Either e a)) -> m (Either e a)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Just a
x -> Either e a -> m (Either e a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either e a -> m (Either e a)) -> Either e a -> m (Either e a)
forall a b. (a -> b) -> a -> b
$ a -> Either e a
forall a b. b -> Either a b
Right a
x
Maybe a
Nothing -> e -> Either e a
forall a b. a -> Either a b
Left (e -> Either e a) -> m e -> m (Either e a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m e
m2
guardOrElse' ::
MonadIO m =>
String ->
ExpectEnv ->
m a ->
m a ->
m a
guardOrElse' :: forall (m :: * -> *) a.
MonadIO m =>
[Char] -> ExpectEnv -> m a -> m a -> m a
guardOrElse' [Char]
var ExpectEnv
expect m a
m = (Either a a -> a) -> m (Either a a) -> m a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((a -> a) -> (a -> a) -> Either a a -> a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either a -> a
forall a. a -> a
id a -> a
forall a. a -> a
id) (m (Either a a) -> m a) -> (m a -> m (Either a a)) -> m a -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> ExpectEnv -> m a -> m a -> m (Either a a)
forall (m :: * -> *) a e.
MonadIO m =>
[Char] -> ExpectEnv -> m a -> m e -> m (Either e a)
guardOrElse [Char]
var ExpectEnv
expect m a
m
guardSet :: MonadIO m => String -> m a -> m (Maybe a)
guardSet :: forall (m :: * -> *) a. MonadIO m => [Char] -> m a -> m (Maybe a)
guardSet [Char]
var = [Char] -> ([Char] -> Bool) -> m a -> m (Maybe a)
forall (m :: * -> *) a.
MonadIO m =>
[Char] -> ([Char] -> Bool) -> m a -> m (Maybe a)
guardPredicate [Char]
var (Bool -> [Char] -> Bool
forall a b. a -> b -> a
const Bool
True)
guardSet_ :: MonadIO m => String -> m a -> m ()
guardSet_ :: forall (m :: * -> *) a. MonadIO m => [Char] -> m a -> m ()
guardSet_ [Char]
var = m (Maybe a) -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m (Maybe a) -> m ()) -> (m a -> m (Maybe a)) -> m a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> m a -> m (Maybe a)
forall (m :: * -> *) a. MonadIO m => [Char] -> m a -> m (Maybe a)
guardSet [Char]
var
guardExpected :: MonadIO m => String -> String -> m a -> m (Maybe a)
guardExpected :: forall (m :: * -> *) a.
MonadIO m =>
[Char] -> [Char] -> m a -> m (Maybe a)
guardExpected [Char]
var [Char]
expected = [Char] -> ([Char] -> Bool) -> m a -> m (Maybe a)
forall (m :: * -> *) a.
MonadIO m =>
[Char] -> ([Char] -> Bool) -> m a -> m (Maybe a)
guardPredicate [Char]
var ([Char] -> [Char] -> Bool
eqCaseInsensitive [Char]
expected)
guardExpected_ :: MonadIO m => String -> String -> m a -> m ()
guardExpected_ :: forall (m :: * -> *) a.
MonadIO m =>
[Char] -> [Char] -> m a -> m ()
guardExpected_ [Char]
var [Char]
expected = m (Maybe a) -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m (Maybe a) -> m ()) -> (m a -> m (Maybe a)) -> m a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> [Char] -> m a -> m (Maybe a)
forall (m :: * -> *) a.
MonadIO m =>
[Char] -> [Char] -> m a -> m (Maybe a)
guardExpected [Char]
var [Char]
expected
guardPredicate_ :: MonadIO m => String -> (String -> Bool) -> m a -> m ()
guardPredicate_ :: forall (m :: * -> *) a.
MonadIO m =>
[Char] -> ([Char] -> Bool) -> m a -> m ()
guardPredicate_ [Char]
var [Char] -> Bool
p = m (Maybe a) -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m (Maybe a) -> m ()) -> (m a -> m (Maybe a)) -> m a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> ([Char] -> Bool) -> m a -> m (Maybe a)
forall (m :: * -> *) a.
MonadIO m =>
[Char] -> ([Char] -> Bool) -> m a -> m (Maybe a)
guardPredicate [Char]
var [Char] -> Bool
p
guardPredicate :: MonadIO m => String -> (String -> Bool) -> m a -> m (Maybe a)
guardPredicate :: forall (m :: * -> *) a.
MonadIO m =>
[Char] -> ([Char] -> Bool) -> m a -> m (Maybe a)
guardPredicate [Char]
var [Char] -> Bool
p m a
io =
IO (Maybe [Char]) -> m (Maybe [Char])
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO ([Char] -> IO (Maybe [Char])
lookupEnv [Char]
var)
m (Maybe [Char]) -> (Maybe [Char] -> m (Maybe a)) -> m (Maybe a)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Just [Char]
result | [Char] -> Bool
p [Char]
result -> a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> m a -> m (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m a
io
Maybe [Char]
_ -> Maybe a -> m (Maybe a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe a
forall a. Maybe a
Nothing
eqCaseInsensitive :: String -> String -> Bool
eqCaseInsensitive :: [Char] -> [Char] -> Bool
eqCaseInsensitive [Char]
a [Char]
b = (Char -> Char) -> ShowS
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Char -> Char
toLower [Char]
a [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== (Char -> Char) -> ShowS
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Char -> Char
toLower [Char]
b