+ = proc str → do case str of
+ "" → none ⤙ ()
+ _ → returnA ⤙ str
+
+chomp ∷ String → String
+{-# INLINE chomp #-}
+chomp = reverse . snd . break (≢ '\n') . reverse
+
+guessMIMEType ∷ LS.ByteString → MIMEType
+{-# INLINEABLE guessMIMEType #-}
+guessMIMEType = read
+ ∘ unsafePerformIO
+ ∘ flip BS.unsafeUseAsCStringLen (magicCString magic)
+ ∘ BS.concat
+ ∘ LS.toChunks
+ where
+ magic ∷ Magic
+ {-# NOINLINE magic #-}
+ magic = unsafePerformIO
+ $ do m ← magicOpen [MagicMime]
+ magicLoadDefault m
+ return m
+
+isSafeChar ∷ Char → Bool
+{-# INLINEABLE isSafeChar #-}
+isSafeChar c
+ | c ≡ '/' = True
+ | isReserved c = False
+ | isUnreserved c = True
+ | otherwise = False
+
+mkQueryString ∷ [(T.Text, T.Text)] → Ascii
+{-# INLINE mkQueryString #-}
+mkQueryString = A.unsafeFromByteString
+ ∘ BBB.toByteString
+ ∘ flip mkBBB (∅)
+ where
+ 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)