packages feed

fakedata-1.0: src/Faker/Class.hs

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 f) = FakeT (liftIO . f)

instance MonadFake m => MonadFake (ReaderT r m) where
  liftFake = lift . liftFake
instance (Monoid w, MonadFake m) => MonadFake (WriterT w m) where
  liftFake = lift . liftFake
instance MonadFake m => MonadFake (StateT s m) where
  liftFake = lift . liftFake
instance MonadFake m => MonadFake (IdentityT m) where
  liftFake = lift . liftFake
instance MonadFake m => MonadFake (ExceptT e m) where
  liftFake = lift . liftFake
instance MonadFake m => MonadFake (MaybeT m) where
  liftFake = lift . liftFake