{-# OPTIONS_GHC -fno-warn-orphans #-}
module Chez.Grater.Internal.CI.Orphans where

import Chez.Grater.Internal.Prelude

import Data.Aeson
  ( FromJSON, FromJSONKey, ToJSON, ToJSONKey, fromJSONKey, fromJSONKeyList, parseJSON, toJSON
  , toJSONKey, toJSONKeyList
  )
import Data.Functor.Contravariant (contramap)
import qualified Data.CaseInsensitive as CI

instance (CI.FoldCase a, FromJSON a) => FromJSON (CI a) where
  parseJSON :: Value -> Parser (CI a)
parseJSON = (a -> CI a) -> Parser a -> Parser (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 (Parser a -> Parser (CI a))
-> (Value -> Parser a) -> Value -> Parser (CI a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Parser a
forall a. FromJSON a => Value -> Parser a
parseJSON

instance (CI.FoldCase a, FromJSONKey a) => FromJSONKey (CI a) where
  fromJSONKey :: FromJSONKeyFunction (CI a)
fromJSONKey = a -> CI a
forall s. FoldCase s => s -> CI s
CI.mk (a -> CI a) -> FromJSONKeyFunction a -> FromJSONKeyFunction (CI a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FromJSONKeyFunction a
forall a. FromJSONKey a => FromJSONKeyFunction a
fromJSONKey
  fromJSONKeyList :: FromJSONKeyFunction [CI a]
fromJSONKeyList = (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])
-> FromJSONKeyFunction [a] -> FromJSONKeyFunction [CI a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FromJSONKeyFunction [a]
forall a. FromJSONKey a => FromJSONKeyFunction [a]
fromJSONKeyList

instance (ToJSON a) => ToJSON (CI a) where
  toJSON :: CI a -> Value
toJSON = a -> Value
forall a. ToJSON a => a -> Value
toJSON (a -> Value) -> (CI a -> a) -> CI a -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CI a -> a
forall s. CI s -> s
CI.original

instance (ToJSONKey a) => ToJSONKey (CI a) where
  toJSONKey :: ToJSONKeyFunction (CI a)
toJSONKey = (CI a -> a) -> ToJSONKeyFunction a -> ToJSONKeyFunction (CI a)
forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a
contramap CI a -> a
forall s. CI s -> s
CI.original ToJSONKeyFunction a
forall a. ToJSONKey a => ToJSONKeyFunction a
toJSONKey
  toJSONKeyList :: ToJSONKeyFunction [CI a]
toJSONKeyList = ([CI a] -> [a])
-> ToJSONKeyFunction [a] -> ToJSONKeyFunction [CI a]
forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a
contramap ((CI a -> a) -> [CI a] -> [a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap CI a -> a
forall s. CI s -> s
CI.original) ToJSONKeyFunction [a]
forall a. ToJSONKey a => ToJSONKeyFunction [a]
toJSONKeyList