, mkQueryString
)
where
-import qualified Codec.Binary.Url as Url
+import qualified Blaze.ByteString.Builder as BBB
import Control.Arrow
import Control.Arrow.ArrowList
+import Data.Ascii (Ascii)
+import qualified Data.Ascii as A
import qualified Data.ByteString as BS
import qualified Data.ByteString.Unsafe as BS
import qualified Data.ByteString.Lazy as LS
-import Data.List
+import Data.Monoid.Unicode
import qualified Data.Text as T
+import qualified Data.Text.Lazy as LT
import Data.Text.Encoding
import Magic
import Network.HTTP.Lucu
| isUnreserved c = True
| otherwise = False
-mkQueryString ∷ [(T.Text, T.Text)] → String
-{-# INLINEABLE mkQueryString #-}
-mkQueryString = intercalate ";" ∘ map pairToStr
+mkQueryString ∷ [(T.Text, T.Text)] → Ascii
+{-# INLINE mkQueryString #-}
+mkQueryString = A.unsafeFromByteString
+ ∘ BBB.toByteString
+ ∘ flip mkBBB (∅)
where
- pairToStr ∷ (T.Text, T.Text) → String
- {-# INLINE pairToStr #-}
- pairToStr (k, v)
- = encode k ⧺ ('=':encode v)
+ mkBBB ∷ [(T.Text, T.Text)] → BBB.Builder → BBB.Builder
+ {-# INLINEABLE mkBBB #-}
+ mkBBB [] acc = acc
+ mkBBB (kv:[]) acc = acc ⊕ pair kv
+ mkBBB (kv:xs) acc = mkBBB xs (acc ⊕ pair kv ⊕ semicolon)
- encode ∷ T.Text → String
- {-# INLINE encode #-}
- encode = Url.encode ∘ BS.unpack ∘ encodeUtf8
+ pair ∷ (T.Text, T.Text) → BBB.Builder
+ {-# INLINE pair #-}
+ pair (k, v)
+ = encodeText k ⊕ equal ⊕ encodeText v
+
+ encodeText ∷ T.Text → BBB.Builder
+ {-# INLINE encodeText #-}
+ encodeText = BBB.fromByteString ∘ URI.encode ∘ encodeUtf8