{-# OPTIONS_GHC -fno-warn-orphans #-}

module Data.GenValidity.IntMap
  ( genIntMapOf,
    shrinkIntMapOf,
  )
where

import Data.GenValidity
import Data.IntMap (IntMap)
import qualified Data.IntMap as M
import Data.Validity.IntMap ()
import Test.QuickCheck

instance (GenValid v) => GenValid (IntMap v) where
  genValid :: Gen (IntMap v)
genValid = Gen (Int, v) -> Gen (IntMap v)
forall v. Gen (Int, v) -> Gen (IntMap v)
genIntMapOf Gen (Int, v)
forall a. GenValid a => Gen a
genValid
  shrinkValid :: IntMap v -> [IntMap v]
shrinkValid = ((Int, v) -> [(Int, v)]) -> IntMap v -> [IntMap v]
forall v. ((Int, v) -> [(Int, v)]) -> IntMap v -> [IntMap v]
shrinkIntMapOf (Int, v) -> [(Int, v)]
forall a. GenValid a => a -> [a]
shrinkValid

genIntMapOf :: Gen (Int, v) -> Gen (IntMap v)
genIntMapOf :: forall v. Gen (Int, v) -> Gen (IntMap v)
genIntMapOf Gen (Int, v)
g = [(Int, v)] -> IntMap v
forall a. [(Int, a)] -> IntMap a
M.fromList ([(Int, v)] -> IntMap v) -> Gen [(Int, v)] -> Gen (IntMap v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Int, v) -> Gen [(Int, v)]
forall a. Gen a -> Gen [a]
genListOf Gen (Int, v)
g

shrinkIntMapOf :: ((Int, v) -> [(Int, v)]) -> IntMap v -> [IntMap v]
shrinkIntMapOf :: forall v. ((Int, v) -> [(Int, v)]) -> IntMap v -> [IntMap v]
shrinkIntMapOf (Int, v) -> [(Int, v)]
shrinker = ([(Int, v)] -> IntMap v) -> [[(Int, v)]] -> [IntMap v]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [(Int, v)] -> IntMap v
forall a. [(Int, a)] -> IntMap a
M.fromList ([[(Int, v)]] -> [IntMap v])
-> (IntMap v -> [[(Int, v)]]) -> IntMap v -> [IntMap v]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Int, v) -> [(Int, v)]) -> [(Int, v)] -> [[(Int, v)]]
forall a. (a -> [a]) -> [a] -> [[a]]
shrinkList (Int, v) -> [(Int, v)]
shrinker ([(Int, v)] -> [[(Int, v)]])
-> (IntMap v -> [(Int, v)]) -> IntMap v -> [[(Int, v)]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntMap v -> [(Int, v)]
forall a. IntMap a -> [(Int, a)]
M.toList