webex-teams-pipes-0.2.0.0: src/Network/WebexTeams/Pipes.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RankNTypes #-}
{-|
Module : Network.WebexTeams.Pipes
Copyright : (c) Naoto Shimazaki 2018
License : MIT (see the file LICENSE)
Maintainer : https://github.com/nshimaza
Stability : experimental
This module provides Pipes wrapper for Cisco Webex Teams list APIs.
-}
module Network.WebexTeams.Pipes
(
-- * Functions
streamListWithFilter
, streamTeamList
, streamOrganizationList
, streamRoleList
) where
import Control.Monad (unless)
import Data.Foldable (traverse_)
import Pipes (MonadIO, Producer', liftIO, yield)
import Network.WebexTeams hiding (streamOrganizationList,
streamRoleList, streamTeamList)
{-|
Common worker function for List APIs.
It accesses List API with given 'Request', unwrap result into list of items, stream them to Pipes pipe
and finally it automatically accesses next page designated via HTTP Link header if available.
-}
readerToProducer :: MonadIO m => ListReader i -> Producer' i m ()
readerToProducer reader = go
where
go = do
xs <- liftIO reader
unless (null xs) $ do
traverse_ yield xs
go
-- | Get list of entities with query parameter and stream it into Pipes. It automatically performs pagination.
streamListWithFilter :: (MonadIO m, WebexTeamsFilter filter, WebexTeamsListItem (ToResponse filter))
=> Authorization -- ^ Authorization string against Webex Teams API.
-> WebexTeamsRequest -- ^ Predefined part of 'Request' commonly used for Webex Teams API.
-> filter -- ^ Filter criteria of the request. Type of filter automatically determines
-- item type in response.
-> Producer' (ToResponse filter) m ()
streamListWithFilter auth base param = getListWithFilter auth base param >>= readerToProducer
-- | List of 'Team' and stream it into Pipes. It automatically performs pagination.
streamTeamList :: MonadIO m => Authorization -> WebexTeamsRequest -> Producer' Team m ()
streamTeamList auth base = getTeamList auth base >>= readerToProducer
-- | Filter list of 'Organization' and stream it into Pipes. It automatically performs pagination.
streamOrganizationList :: MonadIO m => Authorization -> WebexTeamsRequest -> Producer' Organization m ()
streamOrganizationList auth base = getOrganizationList auth base >>= readerToProducer
-- | List of 'Role' and stream it into Pipes. It automatically performs pagination.
streamRoleList :: MonadIO m => Authorization -> WebexTeamsRequest -> Producer' Role m ()
streamRoleList auth base = getRoleList auth base >>= readerToProducer