{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TemplateHaskell #-} module Network.Pushbullet.Types.Pagination where import Data.Aeson import Data.Text ( Text ) import Lens.Micro.TH import Web.HttpApiData ( ToHttpApiData(..) ) -- | Cursors are opaque. newtype Cursor = Cursor Text deriving (Eq, FromJSON, Show, ToJSON, ToHttpApiData) -- | A single page of data, possibly with a cursor attached to it. -- The cursor may be used in routes that return paginated data to produce the -- next page of data. 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"