Neil Mitchell wrote:
The temporary file stuff is wrong - see System.IO.openTemporaryFile.
The only
way to reliably create a temporary file is to open it at the same time,
otherwise there's a race condition.
Looking at it again, I'm not sure that the temporary operations belong
in this module. Ditto for the directory operations. It would be handy
if the directory operations (particularly ensureDirectory) were
somewhere else in the standard libraries though.
It's already there - see System.Directory.createDirectoryIfMIssing.
I have some other issues with naming, and the fact that the library
mixes IO and non-IO functions.
I think this is unavoidable, I tried to make as many functions as
possible pure, but where the filesystem must be consulted they have to
be IO based. For example canonicalPath probably belongs in this
module, but has to be IO based.
There are very few IO functions left: the directory operations are already
provided by System.Directory, we have openTemporaryFile in System.IO which
subsumes the temporary file operations in here. fullPath is just
getCurrentDirectory and combine - it could go in System.Directory as a variant
of getCurrentDirectory, or just leave it out.
If we have shortPath at all, perhaps it would be better named
relativeToCurrentDIrectory?
I'm not sure about canonicalPath. This interface seems to suffer from the same
race conditions as the temporary file interface: the answer is immediately
invalid, so you can't rely on it.
We should avoid referring to $PATH as the "path", since we
already have FilePath.
Agreed, but I couldn't come up with a better name, if anyone has any
suggestions.
"search path" seems the best option, I think.
Where you use the term Filename, I think it should probably
be FilePath. I think we should consistently use a single term,
preferably FilePath.
I have tried to consistently use FilePath as a path to a file, and
filename as the actual name once you get there. For example:
/usr/bin/ghc
Has a FilePath of "/usr/bin/ghc" and a FileName of "ghc".
Then this seems inconsistent with the naming of splitFileName, which should be
splitFilePath. Isn't joinFilename the same as combine?
get/setFilename are ok, but I prefer to reserve get/set for statelike things.
Perhaps instead:
directoryOf :: FilePath -> String
filenameOf :: FilePath -> String
extensionOf :: FilePath -> String
basenaneOf :: FilePath -> String
replaceFilename = joinFilePath . directoryOf
replaceDirectory = flip joinFilePath . filenameOf
etc.
(unfortunately this use of basename is inconsistent with the Unix command,
perhaps there's a better name?).
Cheers,
Simon
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe