]> gitweb @ CieloNegro.org - Rakka.git/blobdiff - Rakka/Utils.hs
Still working on Rakka.Utils...
[Rakka.git] / Rakka / Utils.hs
index 7673eb50230bf58fdab4c9c16ea36040b7c70444..051685cbf8a93cfedb07258fe44a04e0ac9169d3 100644 (file)
@@ -14,14 +14,17 @@ module Rakka.Utils
     , 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
@@ -84,15 +87,23 @@ isSafeChar c
     | 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