module Web.HackerNews.Person where
import Control.Applicative ((<$>), (<*>))
import Control.Monad (MonadPlus (mzero))
import Data.Aeson (FromJSON (parseJSON), Value (Object),
(.:), (.:?), (.!=))
import Data.Text (Text)
import Data.Time (UTCTime)
import Web.HackerNews.Util (fromSeconds)
data Person = Person {
personBy :: Text
, personId :: PersonId
, personKids :: Maybe [Int]
, personScore :: Maybe Int
, personTime :: UTCTime
, personTitle :: Maybe Text
, personType :: Text
, personUrl :: Maybe Text
, personDeleted :: Bool
} deriving (Show, Eq)
newtype PersonId
= PersonId Text
deriving (Show, Eq)
instance FromJSON Person where
parseJSON (Object o) =
Person <$> o .: "by"
<*> (PersonId <$> o .: "id")
<*> o .:? "kids"
<*> o .:? "score"
<*> (fromSeconds <$> o .: "time")
<*> o .:? "title"
<*> o .: "type"
<*> o .:? "url"
<*> o .:? "deleted" .!= False
parseJSON _ = mzero