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

module Data.Validity.CaseInsensitive where

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

instance (Validity a, Eq a, CI.FoldCase a) => Validity (CI a) where
  validate :: CI a -> Validation
validate CI a
ci =
    [Validation] -> Validation
forall a. Monoid a => [a] -> a
mconcat
      [ String -> a -> Validation
forall a. Validity a => String -> a -> Validation
delve String
"original" (a -> Validation) -> a -> Validation
forall a b. (a -> b) -> a -> b
$ CI a -> a
forall s. CI s -> s
CI.original CI a
ci,
        String -> a -> Validation
forall a. Validity a => String -> a -> Validation
delve String
"foldedCase" (a -> Validation) -> a -> Validation
forall a b. (a -> b) -> a -> b
$ CI a -> a
forall s. CI s -> s
CI.foldedCase CI a
ci,
        -- The following could go wrong when using unsafeMk:
        String -> Bool -> Validation
declare String
"The foldedCase is indeed folded correctly" (Bool -> Validation) -> Bool -> Validation
forall a b. (a -> b) -> a -> b
$
          CI a -> a
forall s. CI s -> s
CI.foldedCase CI a
ci a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a -> a
forall s. FoldCase s => s -> s
CI.foldCase (CI a -> a
forall s. CI s -> s
CI.original CI a
ci)
      ]