12 import Control.Arrow.ArrowList
13 import qualified Data.ByteString.Lazy as Lazy (ByteString)
14 import qualified Data.ByteString.Lazy.Char8 as L8 hiding (ByteString)
16 import Network.HTTP.Lucu
17 import System.IO.Unsafe
20 yesOrNo :: Bool -> String
25 parseYesOrNo :: ArrowChoice a => a String Bool
27 = proc str -> do case str of
28 "yes" -> returnA -< True
29 "no" -> returnA -< False
30 _ -> returnA -< error ("Expected yes or no: " ++ str)
33 maybeA :: (ArrowList a, ArrowChoice a) => a b c -> a b (Maybe c)
37 [] -> returnA -< Nothing
38 (x:_) -> returnA -< Just x
41 deleteIfEmpty :: (ArrowList a, ArrowChoice a) => a String String
43 = proc str -> do case str of
48 chomp :: String -> String
49 chomp = reverse . snd . break (/= '\n') . reverse
52 guessMIMEType :: Lazy.ByteString -> MIMEType
53 guessMIMEType = read . unsafePerformIO . magicString magic . L8.unpack
56 magic = unsafePerformIO
57 $ do m <- magicOpen [MagicMime]