module Data.Journal ( Journal (..) , Journal_ , journalHtml ) where import Prolog import Network.URI import Data.Aeson import Data.Alias import Data.Set qualified as S import Text.Blaze import Text.Blaze.Html import Data.Linked data Journal a = Journal { title :: !a , shortTitle :: !(Maybe a) , link :: !(Maybe URI) } deriving (Eq, Foldable, Functor, Generic, Ord, Show, Traversable) instance Binary a => Binary (Journal a) type Journal_ = Journal StrictText journalHtml :: (ToMarkup a) => Journal a -> Html journalHtml (Journal t st l) = linkedHtml $ Linked (maybe t id st) l (t <$ st) instance Ord a => ToAliases (Journal a) a where toAliases (Journal t st _) = S.fromList $ t : toList st instance FromAlias a (Journal a) where fromAlias t = pure $ Journal t Nothing Nothing instance FromJSON a => FromJSON (Journal a) where parseJSON = withObject "Journal" $ \v -> Journal <$> v .: "title" <*> v .:? "short" .!= Nothing <*> v .:? "link" .!= Nothing