-- functions may be useful too for something else.
module Network.HTTP.Lucu.Utils
( splitBy
- , joinWith
, quoteStr
, parseWWWFormURLEncoded
, splitPathInfo
import qualified Data.ByteString.Char8 as BS
import Data.List hiding (last)
import Data.Monoid.Unicode
-import Data.Text (Text)
-import Data.Text.Encoding as T
import Network.URI
import Prelude hiding (last)
import Prelude.Unicode
splitBy ∷ (a → Bool) → [a] → [[a]]
{-# INLINEABLE splitBy #-}
splitBy isSep src
- = case break isSep src
- of (last , [] ) → [last]
- (first, _sep:rest) → first : splitBy isSep rest
-
--- |> joinWith ":" ["ab", "c", "def"]
--- > ==> "ab:c:def"
-joinWith ∷ Ascii → [AsciiBuilder] → AsciiBuilder
-{-# INLINEABLE joinWith #-}
-joinWith sep = flip go (∅)
- where
- go ∷ [AsciiBuilder] → AsciiBuilder → AsciiBuilder
- {-# INLINE go #-}
- go [] ab = ab
- go (x:[]) ab = ab ⊕ x
- go (x:xs) ab = go xs (ab ⊕ A.toAsciiBuilder sep ⊕ x)
+ = case break isSep src of
+ (last , [] ) → [last]
+ (first, _sep:rest) → first : splitBy isSep rest
-- |> quoteStr "abc"
-- > ==> "\"abc\""
-- |> splitPathInfo "http://example.com/foo/bar"
-- > ==> ["foo", "bar"]
-splitPathInfo ∷ URI → [Text]
+splitPathInfo ∷ URI → [ByteString]
splitPathInfo uri
= let reqPathStr = uriPath uri
reqPath = [unEscapeString x | x ← splitBy (≡ '/') reqPathStr, (¬) (null x)]
in
- map (T.decodeUtf8 ∘ BS.pack) reqPath
+ map BS.pack reqPath
-- |> show3 5
-- > ==> "005"
| i ≥ 0 ∧ i < 100 = B.fromByteString "0" ⊕ BT.integral i
| i ≥ 0 ∧ i < 1000 = BT.integral i
| otherwise = error ("show3: the integer i must satisfy 0 <= i < 1000: " ⧺ show i)
+-- FIXME: Drop this function as soon as possible, to eliminate the
+-- dependency on blaze-textual.