-- |
-- Module      : Amazonka.Pager
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
-- Stability   : provisional
-- Portability : non-portable (GHC extensions)
module Amazonka.Pager
  ( AWSPager (..),
    AWSTruncated (..),
    stop,
    choice,
  )
where

import Amazonka.Core.Lens.Internal (Getter, to)
import Amazonka.Data (ToText (..))
import Amazonka.Prelude
import Amazonka.Types
import qualified Data.HashMap.Strict as HashMap

-- | 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 -> AWSResponse a -> Maybe a

-- | Generalise IsTruncated and other optional/required
-- response pagination fields.
class AWSTruncated a where
  truncated :: a -> Bool

instance AWSTruncated Bool where
  truncated :: Bool -> Bool
truncated = forall a. a -> a
id

instance AWSTruncated [a] where
  truncated :: [a] -> Bool
truncated = Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t a -> Bool
null

instance AWSTruncated (HashMap k v) where
  truncated :: HashMap k v -> Bool
truncated = Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k v. HashMap k v -> Bool
HashMap.null

instance {-# OVERLAPPABLE #-} AWSTruncated (Maybe a) where
  truncated :: Maybe a -> Bool
truncated = forall a. Maybe a -> Bool
isJust

instance {-# OVERLAPS #-} AWSTruncated (Maybe Bool) where
  truncated :: Maybe Bool -> Bool
truncated = forall a. a -> Maybe a -> a
fromMaybe Bool
False

stop :: AWSTruncated a => a -> Bool
stop :: forall a. AWSTruncated a => a -> Bool
stop = Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. AWSTruncated a => a -> Bool
truncated

choice ::
  (Alternative f, ToText a, ToText b) =>
  (s -> f a) ->
  (s -> f b) ->
  Getter s (f Text)
choice :: forall (f :: * -> *) a b s.
(Alternative f, ToText a, ToText b) =>
(s -> f a) -> (s -> f b) -> Getter s (f Text)
choice s -> f a
f s -> f b
g = forall (p :: * -> * -> *) (f :: * -> *) s a.
(Profunctor p, Contravariant f) =>
(s -> a) -> Optic' p f s a
to forall a b. (a -> b) -> a -> b
$ \s
x -> (forall a. ToText a => a -> Text
toText forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> s -> f a
f s
x) forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (forall a. ToText a => a -> Text
toText forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> s -> f b
g s
x)