module Reddit.Types.Subreddit where import Reddit.Parser import Reddit.Types.Thing import Control.Applicative import Data.Aeson import Data.Monoid import Data.Text (Text) import Network.API.Builder.Query import Prelude import qualified Data.Text as Text newtype SubredditName = R Text deriving (Show, Read) instance Eq SubredditName where R x == R y = Text.toCaseFold x == Text.toCaseFold y instance Ord SubredditName where R x `compare` R y = Text.toCaseFold x `compare` Text.toCaseFold y instance ToQuery SubredditName where toQuery k (R sub) = [(k, sub)] instance FromJSON SubredditName where parseJSON j = R <$> parseJSON j newtype SubredditID = SubredditID Text deriving (Show, Read, Eq, Ord) instance FromJSON SubredditID where parseJSON (String s) = SubredditID <$> stripPrefix subredditPrefix s parseJSON _ = mempty instance Thing SubredditID where fullName (SubredditID i) = mconcat [subredditPrefix, "_", i] instance ToQuery SubredditID where toQuery k (SubredditID v) = [(k, v)] data Subreddit = Subreddit { subredditID :: SubredditID , name :: SubredditName , title :: Text , subscribers :: Integer , userIsBanned :: Maybe Bool } deriving (Show, Eq) instance FromJSON Subreddit where parseJSON (Object o) = do o `ensureKind` subredditPrefix d <- o .: "data" Subreddit <$> d .: "id" <*> (R <$> d .: "display_name") <*> d .: "title" <*> d .: "subscribers" <*> d .: "user_is_banned" parseJSON _ = mempty instance Thing Subreddit where fullName sub = mconcat [subredditPrefix, "_", s] where SubredditID s = subredditID sub subredditPrefix :: Text subredditPrefix = "t5"