    {-# LANGUAGE CPP #-}
    {-# LANGUAGE RankNTypes #-}

    module Web.Twitter.Conduit.Lens
           (
           -- * 'TT.Response'
             TT.Response
           , responseStatus
           , responseBody
           , responseHeaders
           -- * 'TT.TwitterErrorMessage'
           , TT.TwitterErrorMessage
           , twitterErrorMessage
           , twitterErrorCode

           -- * 'TT.WithCursor'
           , TT.WithCursor
           , previousCursor
           , nextCursor
           , contents

           -- * Re-exports
           , TT.TwitterError(..)
           , TT.CursorKey (..)
           , TT.IdsCursorKey
           , TT.UsersCursorKey
           , TT.ListsCursorKey
           ) where

    #if __GLASGOW_HASKELL__ < 710
    import Control.Applicative
    #endif
    import Control.Lens
    import Data.Text (Text)
    import Network.HTTP.Types (Status, ResponseHeaders)
    import qualified Web.Twitter.Conduit.Cursor as TT
    import qualified Web.Twitter.Conduit.Response as TT

    -- * Lenses for 'TT.Response'
    responseStatus :: forall responseType. Lens' (TT.Response responseType) Status
    responseStatus afb s = (\b -> s { TT.responseStatus = b }) <$> afb (TT.responseStatus s)

    responseHeaders :: forall responseType. Lens' (TT.Response responseType) ResponseHeaders
    responseHeaders afb s = (\b -> s {TT.responseHeaders = b }) <$> afb (TT.responseHeaders s)

    responseBody :: forall a b. Lens (TT.Response a) (TT.Response b) a b
    responseBody afb s = (\b -> s { TT.responseBody = b }) <$> afb (TT.responseBody s)

    -- * Lenses for 'TT.TwitterErrorMessage'

    twitterErrorCode :: Lens' TT.TwitterErrorMessage Int
    twitterErrorCode afb s = (\b -> s { TT.twitterErrorCode = b }) <$> afb (TT.twitterErrorCode s)

    twitterErrorMessage :: Lens' TT.TwitterErrorMessage Text
    twitterErrorMessage afb s = (\b -> s { TT.twitterErrorMessage = b }) <$> afb (TT.twitterErrorMessage s)

    -- * Lenses for 'TT.WithCursor'
    previousCursor :: forall cursorKey wrapped. Lens' (TT.WithCursor cursorKey wrapped) Integer
    previousCursor afb s = (\b -> s { TT.previousCursor = b }) <$> afb (TT.previousCursor s)

    nextCursor :: forall cursorKey wrapped. Lens' (TT.WithCursor cursorKey wrapped) Integer
    nextCursor afb s = (\b -> s { TT.nextCursor = b }) <$> afb (TT.nextCursor s)

    contents :: forall cursorKey a b. Lens (TT.WithCursor cursorKey a) (TT.WithCursor cursorKey b) [a] [b]
    contents afb s = (\b -> s { TT.contents = b }) <$> afb (TT.contents s)