module Data.Person ( Person (..) , Person_ , personHtml , personFromName , Name (..) , URI ) where import Prolog import Data.Aeson import Data.Alias import Data.Linked import Data.Name import Data.Set qualified as S import Network.URI (URI) import Text.Blaze import Text.Blaze.Html data Person a = Person { name :: !(Name a) , webpage :: !(Maybe URI) } deriving (Eq, Functor, Foldable, Generic, Ord, Show, Traversable) instance Binary a => Binary (Person a) type Person_ = Person StrictText personHtml :: (ToMarkup a) => Person a -> Html personHtml (Person n w) = linkedHtml $ Linked (renderNameFML $ toMarkup <$> n) w Nothing personFromName :: Name a -> Person a personFromName n = Person n Nothing instance FromJSON (Name a) => FromJSON (Person a) where parseJSON = withObject "Person" $ \v -> Person <$> v .: "name" <*> v .:? "webpage" .!= Nothing instance Ord (Name a) => ToAliases (Person a) (Name a) where toAliases = S.singleton . name instance FromAlias (Name a) (Person a) where fromAlias n = pure $ Person n Nothing