-- SPDX-FileCopyrightText: 2021 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

module Hedgehog.Gen.SizedList
  ( genSizedList
  , genSomeSizedList
  ) where


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

import Morley.Util.SizedList.Types

genSizedList
  :: forall n m a n'. (SingIPeano n, IsoNatPeano n n', MonadGen m)
  => m a -> m (SizedList' n' a)
genSizedList :: forall (n :: Nat) (m :: * -> *) a (n' :: Peano).
(SingIPeano n, IsoNatPeano n n', MonadGen m) =>
m a -> m (SizedList' n' a)
genSizedList m a
el = SizedList' n' (m a) -> m (SizedList' n' a)
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence (SizedList' n' (m a) -> m (SizedList' n' a))
-> SizedList' n' (m a) -> m (SizedList' n' a)
forall a b. (a -> b) -> a -> b
$ m a -> SizedList' n' (m a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure m a
el

genSomeSizedList
  :: forall m a. (MonadGen m)
  => Range.Range Int -> m a -> m (SomeSizedList a)
genSomeSizedList :: forall (m :: * -> *) a.
MonadGen m =>
Range Int -> m a -> m (SomeSizedList a)
genSomeSizedList Range Int
len m a
el = [a] -> SomeSizedList a
forall l. (FromList l, FromListC l) => [ListElement l] -> l
fromList ([a] -> SomeSizedList a) -> m [a] -> m (SomeSizedList a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range Int -> m a -> m [a]
forall (m :: * -> *) a. MonadGen m => Range Int -> m a -> m [a]
Gen.list Range Int
len m a
el