-- |

module Network.HTTP.Pony.Transformer.CaseInsensitiveHeader where

import Data.Profunctor (Star(..), runStar, dimap)
import Control.Lens (over, ASetter)
import qualified Data.CaseInsensitive as CI

type Middleware f s t a b = (a -> f b) -> s -> f t

caseInsensitive :: (CI.FoldCase header, Functor f)
                     => ASetter req req' header (CI.CI header)
                     -> ASetter res' res (CI.CI header') header'
                     -> Middleware f req res req' res'
caseInsensitive x y = transform
                        (over x CI.mk)
                        (over y CI.original)

transform x y = runStar . dimap x y . Star