-- |
-- Copyright: © 2025 Jonathan Knowles
-- License: Apache-2.0
--
module Data.MonoidMap.QuickCheck.Instances.Arbitrary ()
where

import Data.Functor
    ( (<$>)
    )
import Data.Monoid.Null
    ( MonoidNull
    )
import Data.MonoidMap
    ( MonoidMap
    )
import Data.Ord
    ( Ord
    )
import Test.QuickCheck
    ( Arbitrary (arbitrary, shrink)
    , shrinkMap
    )

import qualified Data.MonoidMap as MonoidMap

instance
    ( Arbitrary k
    , Arbitrary v
    , Ord k
    , MonoidNull v
    )
    => (Arbitrary (MonoidMap k v))
  where
    arbitrary :: Gen (MonoidMap k v)
arbitrary = Map k v -> MonoidMap k v
forall v k. MonoidNull v => Map k v -> MonoidMap k v
MonoidMap.fromMap (Map k v -> MonoidMap k v) -> Gen (Map k v) -> Gen (MonoidMap k v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Map k v)
forall a. Arbitrary a => Gen a
arbitrary
    shrink :: MonoidMap k v -> [MonoidMap k v]
shrink = (Map k v -> MonoidMap k v)
-> (MonoidMap k v -> Map k v) -> MonoidMap k v -> [MonoidMap k v]
forall a b. Arbitrary a => (a -> b) -> (b -> a) -> b -> [b]
shrinkMap Map k v -> MonoidMap k v
forall v k. MonoidNull v => Map k v -> MonoidMap k v
MonoidMap.fromMap MonoidMap k v -> Map k v
forall k v. MonoidMap k v -> Map k v
MonoidMap.toMap