module Reddit.Types.Flair where

import Reddit.Types.Listing
import Reddit.Types.User

import Control.Applicative
import Data.Aeson
import Data.Monoid
import Data.Text (Text)
import Prelude


data Flair = Flair { Flair -> Username
user :: Username
                   , Flair -> Maybe Text
text :: Maybe Text
                   , Flair -> Maybe Text
cssClass :: Maybe Text }
  deriving (Int -> Flair -> ShowS
[Flair] -> ShowS
Flair -> String
(Int -> Flair -> ShowS)
-> (Flair -> String) -> ([Flair] -> ShowS) -> Show Flair
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Flair] -> ShowS
$cshowList :: [Flair] -> ShowS
show :: Flair -> String
$cshow :: Flair -> String
showsPrec :: Int -> Flair -> ShowS
$cshowsPrec :: Int -> Flair -> ShowS
Show, ReadPrec [Flair]
ReadPrec Flair
Int -> ReadS Flair
ReadS [Flair]
(Int -> ReadS Flair)
-> ReadS [Flair]
-> ReadPrec Flair
-> ReadPrec [Flair]
-> Read Flair
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Flair]
$creadListPrec :: ReadPrec [Flair]
readPrec :: ReadPrec Flair
$creadPrec :: ReadPrec Flair
readList :: ReadS [Flair]
$creadList :: ReadS [Flair]
readsPrec :: Int -> ReadS Flair
$creadsPrec :: Int -> ReadS Flair
Read, Flair -> Flair -> Bool
(Flair -> Flair -> Bool) -> (Flair -> Flair -> Bool) -> Eq Flair
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Flair -> Flair -> Bool
$c/= :: Flair -> Flair -> Bool
== :: Flair -> Flair -> Bool
$c== :: Flair -> Flair -> Bool
Eq)

instance FromJSON Flair where
  parseJSON :: Value -> Parser Flair
parseJSON (Object Object
o) =
    Username -> Maybe Text -> Maybe Text -> Flair
Flair (Username -> Maybe Text -> Maybe Text -> Flair)
-> Parser Username -> Parser (Maybe Text -> Maybe Text -> Flair)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser Username
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"user"
          Parser (Maybe Text -> Maybe Text -> Flair)
-> Parser (Maybe Text) -> Parser (Maybe Text -> Flair)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"flair_text"
          Parser (Maybe Text -> Flair) -> Parser (Maybe Text) -> Parser Flair
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"flair_css_class"
  parseJSON Value
_ = Parser Flair
forall a. Monoid a => a
mempty

data FList = FList [Flair] (Maybe UserID) (Maybe UserID)
  deriving (Int -> FList -> ShowS
[FList] -> ShowS
FList -> String
(Int -> FList -> ShowS)
-> (FList -> String) -> ([FList] -> ShowS) -> Show FList
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FList] -> ShowS
$cshowList :: [FList] -> ShowS
show :: FList -> String
$cshow :: FList -> String
showsPrec :: Int -> FList -> ShowS
$cshowsPrec :: Int -> FList -> ShowS
Show, ReadPrec [FList]
ReadPrec FList
Int -> ReadS FList
ReadS [FList]
(Int -> ReadS FList)
-> ReadS [FList]
-> ReadPrec FList
-> ReadPrec [FList]
-> Read FList
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [FList]
$creadListPrec :: ReadPrec [FList]
readPrec :: ReadPrec FList
$creadPrec :: ReadPrec FList
readList :: ReadS [FList]
$creadList :: ReadS [FList]
readsPrec :: Int -> ReadS FList
$creadsPrec :: Int -> ReadS FList
Read, FList -> FList -> Bool
(FList -> FList -> Bool) -> (FList -> FList -> Bool) -> Eq FList
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FList -> FList -> Bool
$c/= :: FList -> FList -> Bool
== :: FList -> FList -> Bool
$c== :: FList -> FList -> Bool
Eq)

instance FromJSON FList where
  parseJSON :: Value -> Parser FList
parseJSON (Object Object
o) =
    [Flair] -> Maybe UserID -> Maybe UserID -> FList
FList ([Flair] -> Maybe UserID -> Maybe UserID -> FList)
-> Parser [Flair] -> Parser (Maybe UserID -> Maybe UserID -> FList)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser [Flair]
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"users"
          Parser (Maybe UserID -> Maybe UserID -> FList)
-> Parser (Maybe UserID) -> Parser (Maybe UserID -> FList)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe UserID)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"next"
          Parser (Maybe UserID -> FList)
-> Parser (Maybe UserID) -> Parser FList
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe UserID)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"prev"
  parseJSON Value
_ = Parser FList
forall a. Monoid a => a
mempty

type FlairListing = Listing UserID Flair

flistToListing :: FList -> FlairListing
flistToListing :: FList -> FlairListing
flistToListing (FList [Flair]
f Maybe UserID
b Maybe UserID
a) = Maybe UserID -> Maybe UserID -> [Flair] -> FlairListing
forall t a. Maybe t -> Maybe t -> [a] -> Listing t a
Listing Maybe UserID
b Maybe UserID
a [Flair]
f