module Data.Paper ( Paper (..) , ArXiv (..) , DOI (..) ) where import Data.Name data Paper a = Paper { date :: !Day , authors :: ![Name a] , title :: !a , doi :: !(Maybe (DOI a)) , arXiv :: !(Maybe (ArXiv a)) , pubStatus :: !(PubStatus a) , abstract :: !a } data ArXiv a = ArXiv { arxivDate :: !Day , arxivID :: !a , arxivClasses :: !(NonEmpty (ArXivClass a)) } deriving (Eq, Foldable, Functor, Generic, Ord, Show, Traversable) data ArXivClass a = ArXiv { archive :: !a , subjectClass :: !a } deriving (Eq, Foldable, Functor, Generic, Ord, Show, Traversable) newtype DOI a = DOI a deriving stock (Eq, Foldable, Functor, Generic, Ord, Show, Traversable) data PubStatus a = Submitted { journal :: !a } | Accepted { journal :: !a } | Published { journal :: !a , volume :: !(Maybe a) , number :: !(Maybe a) , pages :: !(Maybe a) } | UnPublished deriving (Eq, Foldable, Functor, Generic, Ord, Show, Traversable)