51 lines
1.1 KiB
Haskell
51 lines
1.1 KiB
Haskell
{-# LANGUAGE DeriveGeneric #-}
|
|
{-# LANGUAGE TemplateHaskell #-}
|
|
module Data.Entry where
|
|
|
|
import Data.ByteString.Lazy (ByteString)
|
|
import Data.Set (Set)
|
|
import Data.Text (Text)
|
|
import Control.Lens
|
|
import Data.SafeCopy
|
|
import GHC.Generics (Generic)
|
|
import Data.URL (URL )
|
|
import Data.Time (UTCTime)
|
|
|
|
|
|
newtype Tag = Tag Text
|
|
deriving (Show, Eq, Ord, Generic)
|
|
|
|
instance SafeCopy Tag
|
|
|
|
data Entry = Entry
|
|
{ entryURL :: URL
|
|
, entryTitle :: Text
|
|
, entryContent :: ByteString
|
|
, entryScore :: Int
|
|
, entryTags :: Set Tag
|
|
, entryPublished :: UTCTime
|
|
}
|
|
deriving (Eq, Ord, Show)
|
|
|
|
-- * Lenses for accessing relevant parts of entry
|
|
|
|
content :: Lens' Entry ByteString
|
|
content = lens entryContent (\ en bs -> en{entryContent=bs})
|
|
|
|
title :: Lens' Entry Text
|
|
title = lens entryTitle (\ en txt -> en{entryTitle=txt})
|
|
|
|
url :: Lens' Entry URL
|
|
url = lens entryURL (\ en u -> en{entryURL = u})
|
|
|
|
score :: Lens' Entry Int
|
|
score = lens entryScore (\ en n -> en{entryScore=n})
|
|
|
|
tags :: Lens' Entry (Set Tag)
|
|
tags = lens entryTags (\ en txts -> en{entryTags=txts})
|
|
|
|
|
|
|
|
-- * TH generated instances
|
|
deriveSafeCopy 0 'base ''Entry
|