{-# LANGUAGE CPP #-}
{-# LANGUAGE TypeApplications #-}
module GitHub.REST.Monad.Class (
MonadGitHubREST (..),
) where
import Control.Monad (void)
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Except (ExceptT)
import Control.Monad.Trans.Identity (IdentityT)
import Control.Monad.Trans.Maybe (MaybeT)
import qualified Control.Monad.Trans.RWS.Lazy as Lazy
import qualified Control.Monad.Trans.RWS.Strict as Strict
import Control.Monad.Trans.Reader (ReaderT)
import qualified Control.Monad.Trans.State.Lazy as Lazy
import qualified Control.Monad.Trans.State.Strict as Strict
import qualified Control.Monad.Trans.Writer.Lazy as Lazy
import qualified Control.Monad.Trans.Writer.Strict as Strict
import Data.Aeson (FromJSON, Value)
#if !MIN_VERSION_base(4,11,0)
import Data.Monoid ((<>))
#endif
import GitHub.REST.Endpoint
import GitHub.REST.PageLinks (PageLinks (..))
class Monad m => MonadGitHubREST m where
{-# MINIMAL queryGitHubPage #-}
queryGitHubPage :: FromJSON a => GHEndpoint -> m (a, PageLinks)
queryGitHub :: FromJSON a => GHEndpoint -> m a
queryGitHub = ((a, PageLinks) -> a) -> m (a, PageLinks) -> m a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, PageLinks) -> a
forall a b. (a, b) -> a
fst (m (a, PageLinks) -> m a)
-> (GHEndpoint -> m (a, PageLinks)) -> GHEndpoint -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GHEndpoint -> m (a, PageLinks)
forall (m :: * -> *) a.
(MonadGitHubREST m, FromJSON a) =>
GHEndpoint -> m (a, PageLinks)
queryGitHubPage
queryGitHubAll :: (FromJSON a, Monoid a) => GHEndpoint -> m a
queryGitHubAll GHEndpoint
ghEndpoint = do
(a
payload, PageLinks
pageLinks) <- GHEndpoint -> m (a, PageLinks)
forall (m :: * -> *) a.
(MonadGitHubREST m, FromJSON a) =>
GHEndpoint -> m (a, PageLinks)
queryGitHubPage GHEndpoint
ghEndpoint
case PageLinks -> Maybe Text
pageNext PageLinks
pageLinks of
Just Text
next -> do
a
rest <- GHEndpoint -> m a
forall (m :: * -> *) a.
(MonadGitHubREST m, FromJSON a, Monoid a) =>
GHEndpoint -> m a
queryGitHubAll GHEndpoint
ghEndpoint{endpoint :: Text
endpoint = Text
next, endpointVals :: EndpointVals
endpointVals = []}
a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> m a) -> a -> m a
forall a b. (a -> b) -> a -> b
$ a
payload a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
rest
Maybe Text
Nothing -> a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
payload
queryGitHub_ :: GHEndpoint -> m ()
queryGitHub_ = m Value -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m Value -> m ()) -> (GHEndpoint -> m Value) -> GHEndpoint -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FromJSON Value => GHEndpoint -> m Value
forall (m :: * -> *) a.
(MonadGitHubREST m, FromJSON a) =>
GHEndpoint -> m a
queryGitHub @_ @Value
instance MonadGitHubREST m => MonadGitHubREST (ReaderT r m) where
queryGitHubPage :: GHEndpoint -> ReaderT r m (a, PageLinks)
queryGitHubPage = m (a, PageLinks) -> ReaderT r m (a, PageLinks)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (a, PageLinks) -> ReaderT r m (a, PageLinks))
-> (GHEndpoint -> m (a, PageLinks))
-> GHEndpoint
-> ReaderT r m (a, PageLinks)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GHEndpoint -> m (a, PageLinks)
forall (m :: * -> *) a.
(MonadGitHubREST m, FromJSON a) =>
GHEndpoint -> m (a, PageLinks)
queryGitHubPage
instance MonadGitHubREST m => MonadGitHubREST (ExceptT e m) where
queryGitHubPage :: GHEndpoint -> ExceptT e m (a, PageLinks)
queryGitHubPage = m (a, PageLinks) -> ExceptT e m (a, PageLinks)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (a, PageLinks) -> ExceptT e m (a, PageLinks))
-> (GHEndpoint -> m (a, PageLinks))
-> GHEndpoint
-> ExceptT e m (a, PageLinks)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GHEndpoint -> m (a, PageLinks)
forall (m :: * -> *) a.
(MonadGitHubREST m, FromJSON a) =>
GHEndpoint -> m (a, PageLinks)
queryGitHubPage
instance MonadGitHubREST m => MonadGitHubREST (IdentityT m) where
queryGitHubPage :: GHEndpoint -> IdentityT m (a, PageLinks)
queryGitHubPage = m (a, PageLinks) -> IdentityT m (a, PageLinks)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (a, PageLinks) -> IdentityT m (a, PageLinks))
-> (GHEndpoint -> m (a, PageLinks))
-> GHEndpoint
-> IdentityT m (a, PageLinks)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GHEndpoint -> m (a, PageLinks)
forall (m :: * -> *) a.
(MonadGitHubREST m, FromJSON a) =>
GHEndpoint -> m (a, PageLinks)
queryGitHubPage
instance MonadGitHubREST m => MonadGitHubREST (MaybeT m) where
queryGitHubPage :: GHEndpoint -> MaybeT m (a, PageLinks)
queryGitHubPage = m (a, PageLinks) -> MaybeT m (a, PageLinks)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (a, PageLinks) -> MaybeT m (a, PageLinks))
-> (GHEndpoint -> m (a, PageLinks))
-> GHEndpoint
-> MaybeT m (a, PageLinks)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GHEndpoint -> m (a, PageLinks)
forall (m :: * -> *) a.
(MonadGitHubREST m, FromJSON a) =>
GHEndpoint -> m (a, PageLinks)
queryGitHubPage
instance (Monoid w, MonadGitHubREST m) => MonadGitHubREST (Lazy.RWST r w s m) where
queryGitHubPage :: GHEndpoint -> RWST r w s m (a, PageLinks)
queryGitHubPage = m (a, PageLinks) -> RWST r w s m (a, PageLinks)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (a, PageLinks) -> RWST r w s m (a, PageLinks))
-> (GHEndpoint -> m (a, PageLinks))
-> GHEndpoint
-> RWST r w s m (a, PageLinks)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GHEndpoint -> m (a, PageLinks)
forall (m :: * -> *) a.
(MonadGitHubREST m, FromJSON a) =>
GHEndpoint -> m (a, PageLinks)
queryGitHubPage
instance (Monoid w, MonadGitHubREST m) => MonadGitHubREST (Strict.RWST r w s m) where
queryGitHubPage :: GHEndpoint -> RWST r w s m (a, PageLinks)
queryGitHubPage = m (a, PageLinks) -> RWST r w s m (a, PageLinks)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (a, PageLinks) -> RWST r w s m (a, PageLinks))
-> (GHEndpoint -> m (a, PageLinks))
-> GHEndpoint
-> RWST r w s m (a, PageLinks)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GHEndpoint -> m (a, PageLinks)
forall (m :: * -> *) a.
(MonadGitHubREST m, FromJSON a) =>
GHEndpoint -> m (a, PageLinks)
queryGitHubPage
instance MonadGitHubREST m => MonadGitHubREST (Lazy.StateT s m) where
queryGitHubPage :: GHEndpoint -> StateT s m (a, PageLinks)
queryGitHubPage = m (a, PageLinks) -> StateT s m (a, PageLinks)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (a, PageLinks) -> StateT s m (a, PageLinks))
-> (GHEndpoint -> m (a, PageLinks))
-> GHEndpoint
-> StateT s m (a, PageLinks)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GHEndpoint -> m (a, PageLinks)
forall (m :: * -> *) a.
(MonadGitHubREST m, FromJSON a) =>
GHEndpoint -> m (a, PageLinks)
queryGitHubPage
instance MonadGitHubREST m => MonadGitHubREST (Strict.StateT s m) where
queryGitHubPage :: GHEndpoint -> StateT s m (a, PageLinks)
queryGitHubPage = m (a, PageLinks) -> StateT s m (a, PageLinks)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (a, PageLinks) -> StateT s m (a, PageLinks))
-> (GHEndpoint -> m (a, PageLinks))
-> GHEndpoint
-> StateT s m (a, PageLinks)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GHEndpoint -> m (a, PageLinks)
forall (m :: * -> *) a.
(MonadGitHubREST m, FromJSON a) =>
GHEndpoint -> m (a, PageLinks)
queryGitHubPage
instance (Monoid w, MonadGitHubREST m) => MonadGitHubREST (Lazy.WriterT w m) where
queryGitHubPage :: GHEndpoint -> WriterT w m (a, PageLinks)
queryGitHubPage = m (a, PageLinks) -> WriterT w m (a, PageLinks)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (a, PageLinks) -> WriterT w m (a, PageLinks))
-> (GHEndpoint -> m (a, PageLinks))
-> GHEndpoint
-> WriterT w m (a, PageLinks)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GHEndpoint -> m (a, PageLinks)
forall (m :: * -> *) a.
(MonadGitHubREST m, FromJSON a) =>
GHEndpoint -> m (a, PageLinks)
queryGitHubPage
instance (Monoid w, MonadGitHubREST m) => MonadGitHubREST (Strict.WriterT w m) where
queryGitHubPage :: GHEndpoint -> WriterT w m (a, PageLinks)
queryGitHubPage = m (a, PageLinks) -> WriterT w m (a, PageLinks)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (a, PageLinks) -> WriterT w m (a, PageLinks))
-> (GHEndpoint -> m (a, PageLinks))
-> GHEndpoint
-> WriterT w m (a, PageLinks)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GHEndpoint -> m (a, PageLinks)
forall (m :: * -> *) a.
(MonadGitHubREST m, FromJSON a) =>
GHEndpoint -> m (a, PageLinks)
queryGitHubPage