module Yam.Import(
    Text
  , pack
  , cs
  , showText
  , lift
  , MonadIO
  , liftIO
  , when
  , unless
  , void
  , (<>)
  , myThreadId
  , ThreadId
  , killThread
  , fromMaybe
  , maybe
  , mapMaybe
  , catMaybes
  , selectMaybe
  , finally
  , MonadMask
  , MonadThrow
  , MonadCatch
  , catchAll
  , runReaderT
  , ReaderT
  , ask
  , Generic
  , UTCTime
  , randomHex
  , Proxy(..)
  ) where

import           Control.Concurrent
import           Control.Monad              (unless, void, when)
import           Control.Monad.Catch
import           Control.Monad.IO.Class     (MonadIO, liftIO)
import           Control.Monad.Trans.Class
import           Control.Monad.Trans.Reader (ReaderT, ask, runReaderT)
import           Data.Maybe
import           Data.Monoid                ((<>))
import           Data.Proxy
import           Data.String.Conversions    (cs)
import           Data.Text                  (Text, pack)
import           Data.Time.Clock
import           GHC.Generics
import           System.Random              (newStdGen, randoms)


showText :: Show a => a -> Text
showText = cs . show

_hex = ['0'..'9'] <> ['a'..'f']

randomHex :: Int -> IO Text
randomHex n = (pack . map (go _hex 16) . take n . randoms) <$> newStdGen
          where go gs l v = gs !! mod v l

selectMaybe :: [Maybe a] -> Maybe a
selectMaybe = listToMaybe . catMaybes