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


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to