Commit 6f05441f authored by Przemyslaw Kaminski's avatar Przemyslaw Kaminski

some more conduit work

parent 0077455e
......@@ -5,6 +5,7 @@ import Control.Applicative ((<$>))
import Control.Monad.Trans (liftIO)
import Control.Monad.Trans.Resource (MonadResource)
import Data.Conduit ((.|))
import Data.Either (Either(..))
import Data.Function ((&))
import Data.List (intercalate)
import Debug.Trace (trace)
......@@ -23,9 +24,15 @@ import qualified Network.Api.Arxiv as Ax
type Limit = Int
type Soup = Tag String
batchSize :: Int
batchSize = 50
------------------------------------------------------------
-- apiTotal_simple :: [String] -> IO Int
--get :: MonadResource m => Maybe Limit -> [String] -> C.ConduitT () Result m ()
--get Nothing query = searchAxv (simpleQuery query)
--get (Just l) query = searchAxv (simpleQuery query) .| CL.take l
------------------------------------------------------------
-- | Simple Query search for terms in All fields
......@@ -38,7 +45,10 @@ apiComplex limit query = execQuery limit query
------------------------------------------------------------
simpleQuery :: [String] -> Ax.Query
simpleQuery xs = Ax.Query (Just $ Exp $ All xs) [] 0 25
simpleQuery xs = Ax.Query { Ax.qExp = Just $ Exp $ All xs
, Ax.qIds = []
, Ax.qStart = 0
, Ax.qItems = batchSize }
complexQuery :: Ax.Query
complexQuery =
......@@ -61,7 +71,7 @@ execQuery (Just l) q = C.runConduitRes (searchAxv q .| CL.take l)
----------------------------------------------------------------------
-- Execute query and start a source
----------------------------------------------------------------------
searchAxv :: MonadResource m => Ax.Query -> C.ConduitT () Result m ()
searchAxv :: MonadResource m => Ax.Query -> (Int, C.ConduitT () Result m ())
searchAxv q =
let s = Ax.mkQuery q
in do rsp <- HT.httpBS =<< liftIO (parseRequest s)
......@@ -87,10 +97,11 @@ toSoup = C.awaitForever (C.yield . parseTags . B.unpack)
-- Yield all entries and fetch next page
----------------------------------------------------------------------
results :: MonadResource m =>
Ax.Query -> [Soup] -> C.ConduitT () Result m ()
Ax.Query -> [Soup] -> (Int, C.ConduitT () Result m ())
results q sp =
Ax.forEachEntryM sp (C.yield . mkResult)
>> searchAxv (Ax.nextPage q)
( Ax.totalResults sp
, Ax.forEachEntryM sp (C.yield . mkResult)
>> (snd $ searchAxv (Ax.nextPage q)))
----------------------------------------------------------------------
-- Get data and format
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment