module Network.Pushbullet.Types.Pagination where
import Data.Aeson
import Data.Text ( Text )
import Lens.Micro.TH
import Web.HttpApiData ( ToHttpApiData(..) )
newtype Cursor = Cursor Text
deriving (Eq, FromJSON, Show, ToJSON, ToHttpApiData)
data Paginated a
= Page
{ _pageData :: !a
, _pageCursor :: !(Maybe Cursor)
}
deriving (Eq, Functor, Show)
makeLenses ''Paginated
instance FromJSON a => FromJSON (Paginated a) where
parseJSON j@(Object o) = Page <$> parseJSON j <*> o .:? "cursor"
parseJSON _ = fail "cannot parse paginated data from non-object"