packages feed

axel-0.0.5: test/Axel/Test/Monad/ResourceMock.hs

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Axel.Test.Monad.ResourceMock where

import Axel.Monad.Console as Console
import Axel.Monad.FileSystem as FS
import Axel.Monad.Process as Proc
import Axel.Monad.Resource as Res

import Control.Monad.Identity
import Control.Monad.Trans

import System.FilePath

newtype ResourceT m a =
  ResourceT (m a)
  deriving ( Functor
           , Applicative
           , Monad
           , MonadConsole
           , MonadFileSystem
           , MonadProcess
           )

type Resource = ResourceT Identity

instance MonadTrans ResourceT where
  lift = ResourceT

instance (Monad m) => MonadResource (ResourceT m) where
  getResourcePath (Res.ResourceId resourceId) =
    ResourceT $ pure ("resources" </> resourceId)

runResourceT :: ResourceT m a -> m a
runResourceT (ResourceT x) = x

runResource :: Resource a -> a
runResource = runIdentity . runResourceT