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