{-# LANGUAGE OverloadedStrings #-} -- | -- Module : Web.HackerNews.Person -- Copyright : (c) David Johnson, 2014 -- Maintainer : djohnson.m@gmail.com -- Stability : experimental -- Portability : POSIX 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) ------------------------------------------------------------------------------ -- | Person Object 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 , personDead :: Bool } deriving (Show, Eq) ------------------------------------------------------------------------------ -- | Person ID for a `Person` Object newtype PersonId = PersonId Text deriving (Show, Eq) ------------------------------------------------------------------------------ -- | JSON Instances 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 <*> o .:? "dead" .!= False parseJSON _ = mzero