1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
{-# LANGUAGE QuasiQuotes #-}
module Data.Paper
( Paper (..)
, Status (..)
) where
import Prolog
import Data.Journal
import Data.Person
import Data.Time
import Network.URI
import Network.URI.Static
data Paper a = Paper
{ title :: !a
, authors :: ![Name a]
, status :: !(Status a)
} deriving (Eq, Generic, Ord, Show)
-- instance (Binary a, Binary (Status f a), Binary (f (Person a))) => Binary (Paper f a)
data Status a
= Submitted
| Accepted
{ journal :: !a
}
| Published
{ date :: !Day
, journal :: !a
, doi :: !DOI
}
| Unpublished
deriving (Eq, Generic, Ord, Show)
-- instance (Binary a, Binary (f (Journal a))) => Binary (Status f a)
newtype DOI = DOI URI
deriving (Eq, Generic, Ord, Show)
deriving newtype Binary
data ArXiv a = ArXiv
{ _identifier :: !URI
, _class :: !a
} deriving (Eq, Foldable, Functor, Generic, Ord, Show, Traversable)
instance Binary a => Binary (ArXiv a)
arXivURI :: URI
arXivURI = [uri|https://arxiv.org/|]
data ArXivType = ArXivAbs | ArXivPdf | ArXivSrc
deriving (Bounded, Enum, Eq, Generic, Ord, Show)
arXivTypeRelative :: ArXivType -> URI
arXivTypeRelative = \case
ArXivAbs -> [relativeReference|/abs|]
ArXivPdf -> [relativeReference|/pdf|]
ArXivSrc -> [relativeReference|/src|]
arXivLink :: ArXivType -> ArXiv a -> URI
arXivLink at a = _identifier a `relativeTo` arXivTypeRelative at `relativeTo` arXivURI
doiURI :: URI
doiURI = [uri|https://doi.org/|]
doiLink :: DOI -> URI
doiLink (DOI u) = u `relativeTo` doiURI
|