{-# 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] -- ^ A list of IDs -> B.ByteString -- ^ From database -> B.ByteString -- ^ To database -> 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) ]