module Bio.RealWorld.Ensembl
( lookup
) where
import Prelude hiding (lookup)
import Data.Aeson
import Data.List.Split (chunksOf)
import qualified Data.ByteString.Char8 as B
import qualified Data.HashMap.Strict as M
import Network.HTTP.Conduit
import Bio.RealWorld.ID (BioID(..), EnsemblID)
base :: String
base = "http://rest.ensembl.org/"
lookup :: [EnsemblID] -> IO (Either String Object)
lookup xs = do
rs <- mapM lookupHelp $ chunksOf 1000 xs
return $ foldl1 f rs
where
f a b = do
a' <- a
b' <- b
return $ M.union a' b'
lookupHelp :: [EnsemblID] -> IO (Either String Object)
lookupHelp xs = do
initReq <- parseRequest url
let request = initReq { method = "POST"
, requestHeaders = [("Content-type", "application/json")]
, requestBody = body
}
manager <- newManager tlsManagerSettings
r <- httpLbs request manager
return . eitherDecode . responseBody $ r
where
url = base ++ "/lookup/id/"
ids = B.pack $ show $ map fromID xs
body = RequestBodyBS $ B.intercalate "" ["{ \"ids\" :", ids, "}"]