{-# LANGUAGE OverloadedStrings #-} module Network.Miku.Utils where import Data.Bifunctor (first) import Data.ByteString.Char8 (ByteString) import qualified Data.ByteString.Char8 as B import qualified Data.CaseInsensitive as CI import Data.Monoid ((<>)) import qualified Network.HTTP.Types as H import Network.Wai import Prelude hiding ((-)) infixr 0 - {-# INLINE (-) #-} (-) :: (a -> b) -> a -> b f - x = f x infixl 1 & {-# INLINE (&) #-} (&) :: a -> (a -> b) -> b x & f = f x namespace :: ByteString -> Request -> [(ByteString, ByteString)] namespace x = map (first (B.drop - B.length x)) . filter ((x `B.isPrefixOf`) . fst) . map (first CI.original) . requestHeaders putNamespace :: ByteString -> [H.Header] -> Request -> Request putNamespace x xs env = let adds = map (first (CI.map (x <>))) xs newHeaders = map fst adds newRequestHeaders = (requestHeaders env & filter (flip notElem newHeaders . fst)) <> adds in env {requestHeaders = newRequestHeaders} insertLast :: a -> [a] -> [a] insertLast x xs = xs <> [x]