module System.FilePath.Wrapper where
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)
instance (Monoid a) => Monoid (FileT a) where
mempty = FileT mempty
mappend (FileT a) (FileT b) = FileT (a`mappend`b)
type File = FileT FilePath
class FileLike a where
fromFilePath :: FilePath -> a
combine :: a -> a -> a
takeBaseName :: a -> a
takeFileName :: a -> a
makeRelative :: a -> a -> a
replaceExtension :: a -> String -> a
takeExtension :: a -> String
takeExtensions :: a -> String
takeDirectory :: a -> a
dropExtensions :: a -> a
(</>) :: (FileLike a) => a -> a -> a
(</>) = combine
(.=) :: (FileLike a) => a -> String -> a
(.=) = replaceExtension
instance FileLike a => FileLike (FileT a) where
fromFilePath fp = FileT (fromFilePath fp)
combine (FileT a) (FileT b) = FileT (combine a b)
takeBaseName (FileT a) = FileT (takeBaseName a)
takeFileName (FileT a) = FileT (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)
instance FileLike FilePath where
fromFilePath = id
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
unpack :: (FileT FilePath) -> FilePath
unpack (FileT f) = f
toFilePath = unpack