
After the discussion about file paths over the last several days I went home and put together a quick trial implementation for unix file paths, with the idea of adding windows, SMB and maybe VMS (why not?) paths. It is based on a Path class. I'll post it later when I get home. However, I will attempt to recreate the class definition from memory now to see if we can get some discussion going about the methods needed/desired, and whether or not this is a good approach. data PathRoot = UnixFilesystemRoot | WindowsDrive Char | SMBShare String String | VMSDevice String | ... -- whatever else we need class (Show p) => Path p where isAbsolute :: p -> Bool isRelative :: p -> Bool isRelative = not . isAbsolute basename :: p -> String parent :: p -> p pathAppend :: p -> p -> p -- 2nd arg must be a relative path pathSeparator :: p -> Char pathParser :: Parser p -- parsec parser parsePath :: String -> p parsePath str = case parse pathParser "" str of Left e = error (Show e) Right p = p Other operations I think might be worthwhile: pathRoot :: p -> Maybe PathRoot -- relative paths return Nothing pathCleanup :: p -> p -- remove .. and suchlike commonAncestors :: p -> p -> p pathFrom :: p -> p -> p -- returns a relative path from the 1st to the 2nd pathCompare :: p -> p -> ??? -- not sure what this should mean or return hasExtension :: p -> String -> Bool pathToForeign :: p -> IO (Ptr CChar) pathFromForeign :: Ptr CChar -> IO p