Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
A
arxiv-api
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
gargantext
crawlers
arxiv-api
Commits
b635d31b
Commit
b635d31b
authored
Mar 01, 2022
by
Alexandre Delanoë
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[CLEAN] working function
parent
59c82079
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
30 additions
and
111 deletions
+30
-111
Main.hs
app/Main.hs
+3
-90
Arxiv.hs
src/Arxiv.hs
+27
-21
No files found.
app/Main.hs
View file @
b635d31b
module
Main
where
import
qualified
Network.Api.Arxiv
as
Ax
import
Network.Api.Arxiv
(
Expression
(
..
),
Field
(
..
),
(
/*/
),
(
/+/
),(
/-/
))
import
Network.Socket
(
withSocketsDo
)
import
Network.HTTP.Simple
as
HT
import
Network.HTTP.Conduit
(
parseRequest
)
import
Network.HTTP.Types.Status
import
Data.List
(
intercalate
)
import
qualified
Data.ByteString
as
B
hiding
(
unpack
)
import
qualified
Data.ByteString.Char8
as
B
(
unpack
)
import
Data.Conduit
((
.|
))
import
qualified
Data.Conduit
as
C
import
qualified
Data.Conduit.List
as
CL
import
Data.Function
((
&
))
import
Text.HTML.TagSoup
import
Control.Monad.Trans
(
liftIO
)
import
Control.Monad.Trans.Resource
(
MonadResource
)
import
Control.Applicative
((
<$>
))
import
Arxiv
(
main'
)
main
::
IO
()
main
=
withSocketsDo
(
execQuery
makeQuery
)
makeQuery
::
Ax
.
Query
makeQuery
=
let
au
=
Exp
$
Au
[
"Aaronson"
]
t1
=
Exp
$
Ti
[
"quantum"
]
t2
=
Exp
$
Ti
[
"complexity"
]
x
=
au
/*/
(
t1
/+/
t2
)
in
Ax
.
Query
{
Ax
.
qExp
=
Just
x
,
Ax
.
qIds
=
[]
,
Ax
.
qStart
=
0
,
Ax
.
qItems
=
25
}
type
Soup
=
Tag
String
execQuery
::
Ax
.
Query
->
IO
()
execQuery
q
=
C
.
runConduitRes
(
searchAxv
q
.|
outSnk
)
----------------------------------------------------------------------
-- Execute query and start a source
----------------------------------------------------------------------
searchAxv
::
MonadResource
m
=>
Ax
.
Query
->
C
.
ConduitT
()
String
m
()
searchAxv
q
=
let
s
=
Ax
.
mkQuery
q
in
do
rsp
<-
HT
.
httpBS
=<<
liftIO
(
parseRequest
s
)
case
getResponseStatus
rsp
of
(
Status
200
_
)
->
getSoup
(
getResponseBody
rsp
)
>>=
results
q
st
->
error
$
"Error:"
++
show
st
main
=
undefined
----------------------------------------------------------------------
-- Consume page by page
----------------------------------------------------------------------
getSoup
::
MonadResource
m
=>
B
.
ByteString
->
C
.
ConduitT
()
String
m
[
Soup
]
getSoup
b
=
concat
<$>
(
C
.
yield
b
.|
toSoup
.|
CL
.
consume
)
----------------------------------------------------------------------
-- Receive a ByteString and yield Soup
----------------------------------------------------------------------
toSoup
::
MonadResource
m
=>
C
.
ConduitT
B
.
ByteString
[
Soup
]
m
()
toSoup
=
C
.
awaitForever
(
C
.
yield
.
parseTags
.
B
.
unpack
)
----------------------------------------------------------------------
-- Yield all entries and fetch next page
----------------------------------------------------------------------
results
::
MonadResource
m
=>
Ax
.
Query
->
[
Soup
]
->
C
.
ConduitT
()
String
m
()
results
q
sp
=
if
Ax
.
exhausted
sp
then
C
.
yield
(
"EOT: "
++
show
(
Ax
.
totalResults
sp
)
++
" results"
)
else
Ax
.
forEachEntryM_
sp
(
C
.
yield
.
mkResult
)
>>
searchAxv
(
Ax
.
nextPage
q
)
----------------------------------------------------------------------
-- Get data and format
----------------------------------------------------------------------
mkResult
::
[
Soup
]
->
String
mkResult
sp
=
let
aus
=
Ax
.
getAuthorNames
sp
y
=
Ax
.
getYear
sp
tmp
=
Ax
.
getTitle
sp
&
clean
[
'
\n
'
,
'
\r
'
,
'
\t
'
]
ti
=
if
null
tmp
then
"No title"
else
tmp
in
intercalate
", "
aus
++
" ("
++
y
++
"): "
++
ti
where
clean
_
[]
=
[]
clean
d
(
c
:
cs
)
|
c
`
elem
`
d
=
clean
d
cs
|
otherwise
=
c
:
clean
d
cs
----------------------------------------------------------------------
-- Sink results
----------------------------------------------------------------------
outSnk
::
MonadResource
m
=>
C
.
ConduitT
String
C
.
Void
m
()
outSnk
=
C
.
awaitForever
(
liftIO
.
putStrLn
)
src/Arxiv.hs
View file @
b635d31b
module
Arxiv
where
import
qualified
Network.Api.Arxiv
as
Ax
import
Network.Api.Arxiv
(
Expression
(
..
),
Field
(
..
),
(
/*/
),
(
/+/
),(
/-/
))
import
Network.Socket
(
withSocketsDo
)
import
Network.HTTP.Simple
as
HT
import
Network.HTTP.Conduit
(
parseRequest
)
import
Network.HTTP.Types.Status
import
Data.List
(
intercalate
)
import
Control.Applicative
((
<$>
))
import
Control.Monad.Trans
(
liftIO
)
import
Control.Monad.Trans.Resource
(
MonadResource
)
import
Data.Conduit
((
.|
))
import
Data.Function
((
&
))
import
Data.List
(
intercalate
)
import
Network.Api.Arxiv
(
Expression
(
..
),
Field
(
..
),
(
/*/
),
(
/+/
),(
/-/
))
import
Network.HTTP.Conduit
(
parseRequest
)
import
Network.HTTP.Simple
as
HT
import
Network.HTTP.Types.Status
import
Network.Socket
(
withSocketsDo
)
import
Text.HTML.TagSoup
import
Debug.Trace
(
trace
)
import
qualified
Data.ByteString
as
B
hiding
(
unpack
)
import
qualified
Data.ByteString.Char8
as
B
(
unpack
)
import
Data.Conduit
((
.|
))
import
qualified
Data.Conduit
as
C
import
qualified
Data.Conduit.List
as
CL
import
Data.Function
((
&
))
import
Text.HTML.TagSoup
import
Control.Monad.Trans
(
liftIO
)
import
Control.Monad.Trans.Resource
(
MonadResource
)
import
Control.Applicative
((
<$>
))
import
qualified
Network.Api.Arxiv
as
Ax
main''
::
IO
()
main''
=
withSocketsDo
(
execQuery
makeQuery
)
main'
::
IO
[
Result
]
main'
=
withSocketsDo
(
execQuery'
makeQuery
)
...
...
@@ -33,14 +35,18 @@ makeQuery =
in
Ax
.
Query
{
Ax
.
qExp
=
Just
$
Exp
$
All
[
"nuclear fusion"
],
Ax
.
qIds
=
[]
,
Ax
.
qStart
=
50
0
,
Ax
.
qStart
=
0
,
Ax
.
qItems
=
25
}
type
Soup
=
Tag
String
execQuery
::
Ax
.
Query
->
IO
()
execQuery
q
=
C
.
runConduitRes
(
searchAxv'
q
.|
outSnk
)
execQuery'
::
Ax
.
Query
->
IO
[
Result
]
execQuery'
q
=
C
.
runConduitRes
(
searchAxv'
q
.|
CL
.
consume
)
-- .| outSnk')
execQuery'
q
=
C
.
runConduitRes
(
searchAxv'
q
.|
CL
.
take
10
)
-- .| outSnk')
----------------------------------------------------------------------
-- Execute query and start a source
...
...
@@ -84,14 +90,14 @@ results' q sp =
data
Result
=
Result
{
authorNames
::
String
,
year
::
String
,
title
::
String
}
}
deriving
(
Show
)
mkResult'
::
[
Soup
]
->
Result
mkResult'
sp
=
let
aus
=
Ax
.
getAuthorNames
sp
y
=
Ax
.
getYear
sp
tmp
=
Ax
.
getTitle
sp
&
clean
[
'
\n
'
,
'
\r
'
,
'
\t
'
]
ti
=
if
null
tmp
then
"No title"
else
tmp
in
Result
(
intercalate
" "
aus
)
y
ti
in
trace
ti
$
Result
(
intercalate
" "
aus
)
y
ti
where
clean
_
[]
=
[]
clean
d
(
c
:
cs
)
|
c
`
elem
`
d
=
clean
d
cs
|
otherwise
=
c
:
clean
d
cs
...
...
@@ -100,8 +106,8 @@ mkResult' sp = let aus = Ax.getAuthorNames sp
----------------------------------------------------------------------
-- Sink results
----------------------------------------------------------------------
outSnk
::
MonadResource
m
=>
C
.
ConduitT
String
C
.
Void
m
()
outSnk
=
C
.
awaitForever
(
liftIO
.
putStrLn
)
outSnk
::
MonadResource
m
=>
C
.
ConduitT
Result
C
.
Void
m
()
outSnk
=
C
.
awaitForever
(
liftIO
.
putStrLn
.
show
)
{-
outSnk' :: MonadResource m => C.ConduitT Result Result m () -- [Result]
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment