{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
module Env where
import Control.DeepSeq ( NFData )
import Control.Monad ( replicateM )
import Control.Applicative ( liftA2 )
import Data.Char ( isPrint )
import Data.List.NonEmpty
import qualified Data.List.NonEmpty as NEL
import Data.Text ( Text )
import qualified Data.Text as T
import Data.Time.Clock ( UTCTime )
import Data.Time.Clock.POSIX ( POSIXTime
, getPOSIXTime
, posixSecondsToUTCTime
)
import Data.UUID ( UUID )
import qualified Data.UUID as UUID
import qualified Data.UUID.V4 as UUIDV4
import GHC.Generics
import Test.QuickCheck
data BenchEnv = LocalEnv { uuid :: UUID
, subject :: String
, currentTime :: POSIXTime
, currentTimeUtc :: UTCTime
, someFutureTime :: POSIXTime
, someFutureTimeUtc :: UTCTime
, shortPrintableText :: Text
, flipBit :: Bool
, accountList :: NonEmpty (UUID, Text)
, emailsList :: [String]
}
deriving stock (Show, Generic)
instance NFData BenchEnv
localEnv :: IO BenchEnv
localEnv = do
unixTimeNow <- getPOSIXTime
let future = unixTimeNow + 300
LocalEnv
<$> UUIDV4.nextRandom
<*> (UUID.toString <$> UUIDV4.nextRandom)
<*> pure unixTimeNow
<*> pure (posixSecondsToUTCTime unixTimeNow)
<*> pure future
<*> pure (posixSecondsToUTCTime future)
<*> generate genShortPrintableText
<*> generate arbitrary
<*> exampleAccountsList
<*> exampleEmailsList
genShortPrintableText :: Gen Text
genShortPrintableText =
T.pack
. getPrintableString
<$> arbitrary
`suchThat` (not . null . getPrintableString)
genShortASCIIString :: Gen ASCIIString
genShortASCIIString =
arbitrary
`suchThat` (\(ASCIIString ascii) -> not (null ascii) && all isPrint ascii)
exampleAccountsList :: IO (NonEmpty (UUID, Text))
exampleAccountsList = NEL.fromList
<$> replicateM 4 (liftA2 (,) UUIDV4.nextRandom $ generate genShortASCIIText)
where genShortASCIIText = T.pack . getASCIIString <$> genShortASCIIString
exampleEmailsList :: IO [String]
exampleEmailsList = replicateM
2
(generate $ (++ "@example.com") . getASCIIString <$> genShortASCIIString)