{-# 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