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

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

import Data.Map.Strict qualified as Map
import Data.OMap.Strict qualified as OMap
import Data.OSet.Strict qualified as OSet
import Lens.Micro (set)
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 (Ord v, Arbitrary v, OMap.HasOKey k v, Arbitrary k) => Arbitrary (OMap.OMap k v) where
  arbitrary :: Gen (OMap k v)
arbitrary =
    ([v] -> OMap k v) -> Gen [v] -> Gen (OMap k v)
forall a b. (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [v] -> OMap k v
forall (f :: * -> *) k v.
(Foldable f, HasOKey k v) =>
f v -> OMap k v
OMap.fromFoldable (Gen [v] -> Gen (OMap k v))
-> (Map v k -> Gen [v]) -> Map v k -> Gen (OMap k v)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [v] -> Gen [v]
forall a. [a] -> Gen [a]
shuffle ([v] -> Gen [v]) -> (Map v k -> [v]) -> Map v k -> Gen [v]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map v v -> [v]
forall k a. Map k a -> [a]
Map.elems (Map v v -> [v]) -> (Map v k -> Map v v) -> Map v k -> [v]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (v -> k -> v) -> Map v k -> Map v v
forall k a b. (k -> a -> b) -> Map k a -> Map k b
Map.mapWithKey ((k -> v -> v) -> v -> k -> v
forall a b c. (a -> b -> c) -> b -> a -> c
flip (ASetter v v k k -> k -> v -> v
forall s t a b. ASetter s t a b -> b -> s -> t
set ASetter v v k k
forall k v. HasOKey k v => Lens' v k
Lens' v k
OMap.okeyL)) (Map v k -> Gen (OMap k v)) -> Gen (Map v k) -> Gen (OMap k v)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Gen (Map v k)
forall a. Arbitrary a => Gen a
arbitrary