{-# 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 = a -> CI a
forall s. FoldCase s => s -> CI s
CI.mk (a -> CI a) -> Gen a -> Gen (CI a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
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 = (CI a -> Bool) -> [CI a] -> [CI a]
forall a. (a -> Bool) -> [a] -> [a]
filter (CI a -> CI a -> Bool
forall a. Eq a => a -> a -> Bool
/= CI a
c) ([CI a] -> [CI a]) -> (CI a -> [CI a]) -> CI a -> [CI a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> CI a) -> [a] -> [CI a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> CI a
forall s. FoldCase s => s -> CI s
CI.mk ([a] -> [CI a]) -> (CI a -> [a]) -> CI a -> [CI a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> [a]
forall a. GenValid a => a -> [a]
shrinkValid (a -> [a]) -> (CI a -> a) -> CI a -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CI a -> a
forall s. CI s -> s
CI.original (CI a -> [CI a]) -> CI a -> [CI a]
forall a b. (a -> b) -> a -> b
$ CI a
c