module System.FilePath.Wrapper where
import Data.Data
import Data.Typeable
import Control.Applicative
import Control.Monad.State
import Control.Monad.Trans
import qualified System.FilePath as F hiding ((</>))
import qualified Data.Map as M
import Data.Monoid
import Text.Printf
newtype FileT a = FileT a
deriving(Show,Eq,Ord,Data,Typeable)
type File = FileT FilePath
toFilePath :: (FileT FilePath) -> FilePath
toFilePath (FileT f) = f
fromFilePath :: FilePath -> FileT FilePath
fromFilePath f = FileT f
instance (Monoid a) => Monoid (FileT a) where
mempty = FileT mempty
mappend (FileT a) (FileT b) = FileT (a`mappend`b)
class FileLike a where
combine :: a -> String -> a
takeDirectory :: a -> a
takeBaseName :: a -> String
takeFileName :: a -> String
makeRelative :: a -> a -> a
replaceExtension :: a -> String -> a
takeExtension :: a -> String
takeExtensions :: a -> String
dropExtensions :: a -> a
dropExtension :: a -> a
(</>) :: (FileLike a) => a -> String -> a
(</>) = combine
(.=) :: (FileLike a) => a -> String -> a
(.=) = replaceExtension
instance FileLike a => FileLike (FileT a) where
combine (FileT a) b = FileT (combine a b)
takeBaseName (FileT a) = takeBaseName a
takeFileName (FileT a) = takeFileName a
takeExtension (FileT a) = takeExtension a
takeExtensions (FileT a) = takeExtensions a
makeRelative (FileT a) (FileT b) = FileT (makeRelative a b)
replaceExtension (FileT a) ext = FileT (replaceExtension a ext)
takeDirectory (FileT a) = FileT (takeDirectory a)
dropExtensions (FileT a) = FileT (dropExtensions a)
dropExtension (FileT a) = FileT (dropExtension a)
instance FileLike FilePath where
combine = F.combine
takeBaseName = F.takeBaseName
takeFileName = F.takeFileName
makeRelative = F.makeRelative
replaceExtension = F.replaceExtension
takeDirectory = F.takeDirectory
takeExtension = F.takeExtension
takeExtensions = F.takeExtensions
dropExtensions = F.dropExtensions
dropExtension = F.dropExtension