{-# LANGUAGE OverloadedStrings #-}
module Bio.RealWorld.Uniprot
( mapID
) where
import Conduit
import qualified Data.ByteString.Char8 as B
import qualified Data.HashMap.Strict as M
import Network.HTTP.Conduit
base :: String
base = "http://www.uniprot.org/uploadlists/"
mapID :: [B.ByteString]
-> B.ByteString
-> B.ByteString
-> IO [Maybe B.ByteString]
mapID ids from to = do
initReq <- parseRequest base
let request = setQueryString query initReq
{ method = "GET"
, requestHeaders = [("User-Agent", "kk@test.org")]
}
manager <- newManager tlsManagerSettings
r <- fmap M.fromList $ runResourceT $ do
response <- http request manager
runConduit $ responseBody response .| linesUnboundedAsciiC .|
(dropC 1 >> mapC ((\[a,b] -> (a,b)) . B.split '\t')) .| sinkList
return $ map (flip M.lookup r) ids
where
query = [ ("from", Just from)
, ("to", Just to)
, ("format", Just "tab")
, ("query", Just $ B.unwords ids)
]