{-# language OverloadedStrings #-} module RubiX.Utils where import Data.Bifunctor import Data.Maybe import qualified Data.Map as DM import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as LBS import qualified Data.Text.Lazy as LT import qualified Data.Text.Lazy.Encoding as LT import qualified Data.Text as T import qualified Data.Text.Encoding as T import qualified Data.CaseInsensitive as CI import qualified Network.HTTP.Types.Header as HTTP import Network.HTTP.Types.URI import RubiX.Types toByteString :: T.Text -> BS.ByteString toByteString = T.encodeUtf8 toLazyByteString :: T.Text -> LBS.ByteString toLazyByteString = LT.encodeUtf8 . LT.fromStrict fromByteString :: BS.ByteString -> T.Text fromByteString = T.decodeUtf8 fromLazyByteString :: LBS.ByteString -> T.Text fromLazyByteString = LT.toStrict . LT.decodeUtf8 makeHeader :: T.Text -> T.Text -> HTTP.Header makeHeader headerName headerVal = (CI.mk (toByteString headerName), toByteString headerVal) fromHeaderMap :: HeaderMap -> HTTP.ResponseHeaders fromHeaderMap hm = do (headerName, values) <- DM.toList hm [(CI.map toByteString headerName, toByteString value) | value <- values] convertHeaders :: HTTP.RequestHeaders -> HeaderMap convertHeaders = DM.fromListWith mappend . fmap (bimap mapName mapVal) where mapName = CI.map fromByteString mapVal val = [fromByteString val] convertQueries :: Query -> MultiQueryMap convertQueries = DM.fromListWith (flip mappend) . fmap (second maybeToList) . queriesToList simpleQuery :: Query -> QueryMap simpleQuery = DM.fromListWith (flip const) . fmap (second (fromMaybe "")) . queriesToList queriesToList :: Query -> [(T.Text, Maybe T.Text)] queriesToList = fmap $ bimap fromByteString $ fmap fromByteString