packages feed

hal-0.4.10: test/AWS/Lambda/Events/ApiGateway/ProxyRequest/Gen/Parameters.hs

{-# LANGUAGE CPP #-}
module AWS.Lambda.Events.ApiGateway.ProxyRequest.Gen.Parameters where

import           Control.Monad.Trans.State
import           Data.HashMap.Strict       (HashMap)
import qualified Data.HashMap.Strict       as H
#if !MIN_VERSION_base(4,11,0)
import           Data.Semigroup            ((<>))
#endif
import           Data.Set                  (Set)
import qualified Data.Set                  as S
import           Data.Text                 (Text)
import           Hedgehog
import qualified Hedgehog.Gen              as Gen
import qualified Hedgehog.Range            as Range

multiParameters :: Gen (HashMap Text [Text])
multiParameters = H.fromListWith (<>) <$>
    evalStateT (Gen.list (Range.linear 1 10) parameter) S.empty

parameter :: StateT (Set Text) Gen (Text, [Text])
parameter = Gen.choice [fresh, clash] where
    fresh = do
        vars <- get
        newVar <- Gen.filterT (not . (`S.member` vars)) var
        put $ S.insert newVar vars
        v <- val
        pure (newVar, [v])
    clash = do
        vars <- get
        if null vars
        then fresh
        else do
            var <- Gen.element $ S.toList vars
            v <- val
            pure (var, [v])

var :: MonadGen g => g Text
var = Gen.text (Range.linear 1 10) Gen.alpha

val :: MonadGen g => g Text
val = Gen.text (Range.linear 1 15) Gen.unicode