summaryrefslogtreecommitdiff
path: root/src/Data/Paper.hs
blob: c2d4b3eee5ad02ee005dd1e88c1bbcb1b8d16901 (plain)
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