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

module Data.GenValidity.CaseInsensitive where

import Data.CaseInsensitive (CI)
import qualified Data.CaseInsensitive as CI
import Data.GenValidity
import Data.Validity.CaseInsensitive ()

instance (Eq a, CI.FoldCase a, GenValid a) => GenValid (CI a) where
  genValid :: Gen (CI a)
genValid = forall s. FoldCase s => s -> CI s
CI.mk forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. GenValid a => Gen a
genValid

  -- We have to filter out c again, because for values like String, case
  -- folding means we could end up with the same string again (according to
  -- Eq).
  shrinkValid :: CI a -> [CI a]
shrinkValid CI a
c = forall a. (a -> Bool) -> [a] -> [a]
filter (forall a. Eq a => a -> a -> Bool
/= CI a
c) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall s. FoldCase s => s -> CI s
CI.mk forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. GenValid a => a -> [a]
shrinkValid forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. CI s -> s
CI.original forall a b. (a -> b) -> a -> b
$ CI a
c