content: {-# LANGUAGE CPP #-}
  
  module Test.Sandwich.WebDriver.Internal.Util where
  
  import Control.Monad
  import Control.Monad.IO.Unlift
  import qualified Data.Text as T
  import qualified System.Random as R
  import Test.Sandwich (expectationFailure)
  import UnliftIO.Exception
  
  
  -- * Exceptions
  
  leftOnException :: (MonadUnliftIO m) => m (Either T.Text a) -> m (Either T.Text a)
  leftOnException = handle (\(e :: SomeException) -> return $ Left $ T.pack $ show e)
  
  exceptionOnLeft :: (MonadUnliftIO m) => m (Either T.Text a) -> m a
  exceptionOnLeft action = action >>= \case
    Left err -> expectationFailure (T.unpack err)
    Right x -> pure x
  
  leftOnException' :: (MonadUnliftIO m) => m a -> m (Either T.Text a)
  leftOnException' action = catch (Right <$> action) (\(e :: SomeException) -> return $ Left $ T.pack $ show e)
  
  -- * Util
  
  whenJust :: (Monad m) => Maybe a -> (a -> m b) -> m ()
  whenJust Nothing _ = return ()
  whenJust (Just x) action = void $ action x
  
  whenLeft :: (Monad m) => Either a b -> (a -> m ()) -> m ()
  whenLeft (Left x) action = action x
  whenLeft (Right _) _ = return ()
  
  whenRight :: (Monad m) => Either a b -> (b -> m ()) -> m ()
  whenRight (Left _) _ = return ()
  whenRight (Right x) action = action x
  
  makeUUID :: IO T.Text
  makeUUID = (T.pack . take 10 . R.randomRs ('a','z')) <$> R.newStdGen
  