{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE RankNTypes #-} -- | -- Module : Network.AWS.Pager -- Copyright : (c) 2013-2017 Brendan Hay -- License : Mozilla Public License, v. 2.0. -- Maintainer : Brendan Hay -- Stability : provisional -- Portability : non-portable (GHC extensions) -- module Network.AWS.Pager ( AWSPager (..) , AWSTruncated (..) , stop , choice ) where import Control.Applicative import Data.HashMap.Strict (HashMap) import qualified Data.HashMap.Strict as Map import Data.List.NonEmpty (NonEmpty) import Data.Maybe (isJust, fromMaybe) import Data.Text (Text) import Network.AWS.Data.Text (ToText (..)) import Network.AWS.Lens (Getter, to) import Network.AWS.Types -- | Specify how an 'AWSRequest' and it's associated 'Rs' response can -- generate a subsequent request, if available. class AWSRequest a => AWSPager a where page :: a -> Rs a -> Maybe a -- | Generalise IsTruncated and other optional/required -- response pagination fields. class AWSTruncated a where truncated :: a -> Bool instance AWSTruncated Bool where truncated = id instance AWSTruncated [a] where truncated = not . null instance AWSTruncated (HashMap k v) where truncated = not . Map.null instance {-# OVERLAPPABLE #-} AWSTruncated (Maybe a) where truncated = isJust instance {-# OVERLAPS #-} AWSTruncated (Maybe Bool) where truncated = fromMaybe False stop :: AWSTruncated a => a -> Bool stop = not . truncated choice :: (Alternative f, ToText a, ToText b) => (s -> f a) -> (s -> f b) -> Getter s (f Text) choice f g = to $ \x -> (toText <$> f x) <|> (toText <$> g x)