packages feed

system-lifted-0.2.0.1: src/System/Directory/Lifted.hs

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE OverlappingInstances #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE QuasiQuotes #-}

module System.Directory.Lifted
  ( SystemDirectory (..)
  , Permissions (..)
  , deriveSystemDirectory
  ) where

import System.Lifted
import qualified System.Directory as D
import System.Directory (Permissions(..))
import Data.Time.Clock

import Language.Haskell.TH

(.:) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
(.:) = (.).(.)

-- | System.Directory as a Class.
-- Instances for MaybeT and EitherT (String|Text|IOException|())
class SystemDirectory e where
  createDirectory             :: FilePath -> e IO ()
  createDirectoryIfMissing    :: Bool -> FilePath -> e IO ()
  removeDirectory             :: FilePath -> e IO ()
  removeDirectoryRecursive    :: FilePath -> e IO ()
  renameDirectory             :: FilePath -> FilePath -> e IO ()
  getDirectoryContents        :: FilePath -> e IO [FilePath]
  getCurrentDirectory         :: e IO FilePath
  setCurrentDirectory         :: FilePath -> e IO ()
  getHomeDirectory            :: e IO FilePath
  getAppUserDataDirectory     :: String -> e IO FilePath
  getUserDocumentsDirectory   :: e IO FilePath
  getTemporaryDirectory       :: e IO FilePath
  removeFile                  :: FilePath -> e IO ()
  renameFile                  :: FilePath -> FilePath -> e IO ()
  copyFile                    :: FilePath -> FilePath -> e IO ()
  canonicalizePath            :: FilePath -> e IO FilePath
  makeRelativeToCurrentDirectory :: FilePath -> e IO FilePath
  -- this may deserve a special case...
  findExecutable              :: String -> e IO (Maybe FilePath)
  findFile                    :: [FilePath] -> String -> e IO (Maybe FilePath)
  doesFileExist               :: FilePath -> e IO Bool
  doesDirectoryExist          :: FilePath -> e IO Bool
  getPermissions              :: FilePath -> e IO Permissions
  setPermissions              :: FilePath -> Permissions -> e IO ()
  copyPermissions             :: FilePath -> FilePath -> e IO ()
  getModificationTime         :: FilePath -> e IO UTCTime

deriveSystemDirectory :: Name -> DecsQ
deriveSystemDirectory tp = let
    nm = conT tp
  in [d|

    instance SystemDirectory $nm where
      createDirectory            = ioT .  D.createDirectory
      createDirectoryIfMissing   = ioT .: D.createDirectoryIfMissing
      removeDirectory            = ioT .  D.removeDirectory
      removeDirectoryRecursive   = ioT .  D.removeDirectoryRecursive
      renameDirectory orig       = ioT .  D.renameDirectory orig
      getDirectoryContents       = ioT .  D.getDirectoryContents
      getCurrentDirectory        = ioT    D.getCurrentDirectory
      setCurrentDirectory        = ioT .  D.setCurrentDirectory
      getHomeDirectory           = ioT    D.getHomeDirectory
      getAppUserDataDirectory    = ioT .  D.getAppUserDataDirectory
      getUserDocumentsDirectory  = ioT    D.getUserDocumentsDirectory
      getTemporaryDirectory      = ioT    D.getTemporaryDirectory
      removeFile                 = ioT .  D.removeFile
      renameFile                 = ioT .: D.renameFile
      copyFile                   = ioT .: D.copyFile
      canonicalizePath           = ioT .  D.canonicalizePath
      makeRelativeToCurrentDirectory = ioT . D.makeRelativeToCurrentDirectory
      findExecutable             = ioT .  D.findExecutable
      findFile                   = ioT .: D.findFile
      doesFileExist              = ioT .  D.doesFileExist
      doesDirectoryExist         = ioT .  D.doesDirectoryExist
      getPermissions             = ioT .  D.getPermissions
      setPermissions             = ioT .: D.setPermissions
      copyPermissions            = ioT .: D.copyPermissions
      getModificationTime        = ioT .  D.getModificationTime
  |]