1 {-# LANGUAGE OverloadedStrings, RecordWildCards #-}
    2 module Databrary.Model.Citation.Types
    3   ( Citation(..)
    4   ) where
    5 
    6 import Control.Applicative ((<|>))
    7 import Data.Int (Int16)
    8 import Data.Monoid ((<>))
    9 import qualified Data.Text as T
   10 
   11 import qualified Databrary.JSON as JSON
   12 import Databrary.Model.URL (URI)
   13 
   14 data Citation = Citation
   15   { citationHead :: T.Text
   16   , citationURL :: Maybe URI
   17   , citationYear :: Maybe Int16
   18   , citationTitle :: Maybe T.Text
   19   }
   20 
   21 instance Monoid Citation where
   22   mempty = Citation
   23     { citationHead = T.empty
   24     , citationURL = Nothing
   25     , citationYear = Nothing
   26     , citationTitle = Nothing
   27     }
   28   mappend a b = Citation
   29     { citationHead = if T.null (citationHead a) then citationHead b else citationHead a
   30     , citationURL = citationURL a <|> citationURL b
   31     , citationYear = citationYear a <|> citationYear b
   32     , citationTitle = citationTitle a <|> citationTitle b
   33     }
   34 
   35 citationJSON :: JSON.ToObject o => Citation -> o
   36 citationJSON Citation{..} =
   37      "head" JSON..= citationHead
   38   <> "title" `JSON.kvObjectOrEmpty` citationTitle
   39   <> "url" `JSON.kvObjectOrEmpty` citationURL
   40   <> "year" `JSON.kvObjectOrEmpty` citationYear
   41 
   42 instance JSON.ToJSON Citation where
   43   toJSON = JSON.object . citationJSON
   44   toEncoding = JSON.pairs . citationJSON