Put "Valid x =>" constraint on joinDrive QuickCheck property
authorThomas Miedema <thomasmiedema@gmail.com>
Tue, 28 Oct 2014 18:57:32 +0000 (19:57 +0100)
committerThomas Miedema <thomasmiedema@gmail.com>
Tue, 28 Oct 2014 19:19:39 +0000 (20:19 +0100)
Counterexample:

    $ let x = "\\\\?\\D:file"
    $ splitDrive x
    ("\\\\?\\D:","file")
    $ uncurry joinDrive (splitDrive x)
    "\\\\?\\D:\\file"

The "problem" is that the current implementation of splitDrive can sometimes
return invalid drives, such as in the above example. However, if it wouldn't
do so, it would make the implementation of isValid and makeValid more
difficult.

My guideline is currently as follows: splitDrive makes the rough cut of what
is and what isn't a drive, isValid and makeValid finish the job, all other
functions assume drives and paths are valid.

This is also the reason joinDrive (=combineAlways) should not be changed to
not insert the extra slash, solely to handle an invalid path.

System/FilePath/Internal.hs

index e3fa7cb..8f2c51b 100644 (file)
@@ -377,7 +377,7 @@ readDriveShareName name = addSlash a b
 
 -- | Join a drive and the rest of the path.
 --
--- >          uncurry joinDrive (splitDrive x) == x
+-- > Valid x => uncurry joinDrive (splitDrive x) == x
 -- > Windows: joinDrive "C:" "foo" == "C:foo"
 -- > Windows: joinDrive "C:\\" "bar" == "C:\\bar"
 -- > Windows: joinDrive "\\\\share" "foo" == "\\\\share\\foo"