-- SPDX-FileCopyrightText: 2020 Tocqueville Group
--
-- SPDX-License-Identifier: LicenseRef-MIT-TQ

module Hedgehog.Gen.Lorentz.UStore
  ( genUStoreSubMap
  , genUStoreFieldExt
  ) where

import Prelude

import Hedgehog (MonadGen)
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range

import Lorentz.UStore.Types (UStoreFieldExt(..), type (|~>) (..))

import Cleveland.Util (genTuple2)

genUStoreSubMap :: (MonadGen m, Ord k) => m k -> m v -> m (k |~> v)
genUStoreSubMap :: m k -> m v -> m (k |~> v)
genUStoreSubMap m k
genK m v
genV = Map k v -> k |~> v
forall k v. Map k v -> k |~> v
UStoreSubMap (Map k v -> k |~> v) -> m (Map k v) -> m (k |~> v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range Int -> m (k, v) -> m (Map k v)
forall (m :: * -> *) k v.
(MonadGen m, Ord k) =>
Range Int -> m (k, v) -> m (Map k v)
Gen.map (Int -> Int -> Range Int
forall a. Integral a => a -> a -> Range a
Range.linear Int
0 Int
100) (m k -> m v -> m (k, v)
forall (m :: * -> *) a b. MonadGen m => m a -> m b -> m (a, b)
genTuple2 m k
genK m v
genV)

genUStoreFieldExt :: MonadGen m => m v -> m (UStoreFieldExt marker v)
genUStoreFieldExt :: m v -> m (UStoreFieldExt marker v)
genUStoreFieldExt m v
genV = v -> UStoreFieldExt marker v
forall (m :: UStoreMarkerType) v. v -> UStoreFieldExt m v
UStoreField (v -> UStoreFieldExt marker v)
-> m v -> m (UStoreFieldExt marker v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m v
genV