{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Test.Cardano.Data.Arbitrary (genOSet) where

import Data.OMap.Strict qualified as OMap
import Data.OSet.Strict qualified as OSet
import Test.Cardano.Ledger.Binary.Arbitrary ()
import Test.QuickCheck

instance (Arbitrary a, Ord a) => Arbitrary (OSet.OSet a) where
  arbitrary :: Gen (OSet a)
arbitrary = Gen a -> Gen (OSet a)
forall a. Ord a => Gen a -> Gen (OSet a)
genOSet Gen a
forall a. Arbitrary a => Gen a
arbitrary

genOSet :: Ord a => Gen a -> Gen (OSet.OSet a)
genOSet :: forall a. Ord a => Gen a -> Gen (OSet a)
genOSet = ([a] -> OSet a) -> Gen [a] -> Gen (OSet a)
forall a b. (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [a] -> OSet a
forall (f :: * -> *) a. (Foldable f, Ord a) => f a -> OSet a
OSet.fromFoldable (Gen [a] -> Gen (OSet a))
-> (Gen a -> Gen [a]) -> Gen a -> Gen (OSet a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Gen a -> Gen [a]
forall a. Gen a -> Gen [a]
listOf

instance (Arbitrary v, OMap.HasOKey k v, Arbitrary k) => Arbitrary (OMap.OMap k v) where
  arbitrary :: Gen (OMap k v)
arbitrary = forall (f :: * -> *) k v.
(Foldable f, HasOKey k v) =>
f v -> OMap k v
OMap.fromFoldable @[] ([v] -> OMap k v) -> Gen [v] -> Gen (OMap k v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [v]
forall a. Arbitrary a => Gen a
arbitrary