module Faker.Class
  ( MonadFake(..)
  ) where

import Faker (FakeT(..), Fake)

import Control.Monad.IO.Class
import Control.Monad.Trans.Class (MonadTrans(lift))
import Control.Monad.Trans.Except (ExceptT)
import Control.Monad.Trans.Identity (IdentityT)
import Control.Monad.Trans.Maybe (MaybeT)
import Control.Monad.Trans.Reader (ReaderT)
import Control.Monad.Trans.State (StateT)
import Control.Monad.Trans.Writer (WriterT)

class Monad m => MonadFake m where
  liftFake :: Fake a -> m a

instance MonadIO m => MonadFake (FakeT m) where
  liftFake :: Fake a -> FakeT m a
liftFake (Fake FakerSettings -> IO a
f) = (FakerSettings -> m a) -> FakeT m a
forall (m :: * -> *) a. (FakerSettings -> m a) -> FakeT m a
FakeT (IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO a -> m a) -> (FakerSettings -> IO a) -> FakerSettings -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FakerSettings -> IO a
f)

instance MonadFake m => MonadFake (ReaderT r m) where
  liftFake :: Fake a -> ReaderT r m a
liftFake = m a -> ReaderT r m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> ReaderT r m a)
-> (Fake a -> m a) -> Fake a -> ReaderT r m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Fake a -> m a
forall (m :: * -> *) a. MonadFake m => Fake a -> m a
liftFake
instance (Monoid w, MonadFake m) => MonadFake (WriterT w m) where
  liftFake :: Fake a -> WriterT w m a
liftFake = m a -> WriterT w m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> WriterT w m a)
-> (Fake a -> m a) -> Fake a -> WriterT w m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Fake a -> m a
forall (m :: * -> *) a. MonadFake m => Fake a -> m a
liftFake
instance MonadFake m => MonadFake (StateT s m) where
  liftFake :: Fake a -> StateT s m a
liftFake = m a -> StateT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> StateT s m a) -> (Fake a -> m a) -> Fake a -> StateT s m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Fake a -> m a
forall (m :: * -> *) a. MonadFake m => Fake a -> m a
liftFake
instance MonadFake m => MonadFake (IdentityT m) where
  liftFake :: Fake a -> IdentityT m a
liftFake = m a -> IdentityT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> IdentityT m a)
-> (Fake a -> m a) -> Fake a -> IdentityT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Fake a -> m a
forall (m :: * -> *) a. MonadFake m => Fake a -> m a
liftFake
instance MonadFake m => MonadFake (ExceptT e m) where
  liftFake :: Fake a -> ExceptT e m a
liftFake = m a -> ExceptT e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> ExceptT e m a)
-> (Fake a -> m a) -> Fake a -> ExceptT e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Fake a -> m a
forall (m :: * -> *) a. MonadFake m => Fake a -> m a
liftFake
instance MonadFake m => MonadFake (MaybeT m) where
  liftFake :: Fake a -> MaybeT m a
liftFake = m a -> MaybeT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> MaybeT m a) -> (Fake a -> m a) -> Fake a -> MaybeT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Fake a -> m a
forall (m :: * -> *) a. MonadFake m => Fake a -> m a
liftFake