open System open System.Platform def norm (f : FilePath) : String := f.toString.map fun c => if c == '\\' then '/' else c #eval FilePath.isAbsolute (if isWindows then "C:\\foo" else "/foo") #eval FilePath.isAbsolute "a/b" #eval norm <| ("a" : FilePath) / "b" #eval norm <| ("a" : FilePath) / "b" / "c" #eval norm <| ("a" : FilePath) / "/b/c" #eval norm <$> FilePath.parent "a/b" #eval norm <$> FilePath.parent "a/b/c" #eval norm <$> FilePath.parent "a" /-! Test FilePath.parent with absolute paths general cases -/ #eval norm <$> FilePath.parent "/a/b/c" #eval norm <$> FilePath.parent "/a" #eval norm <$> FilePath.parent "/aaa" #eval norm <$> FilePath.parent "/" /-! Test FilePath.parent with absolute paths for OS specific cases Some of these tests are not meaningful on Unix but are included for clarity -/ def testParentAcrossOS (p : FilePath) (windowsParent : Option String) (unixParent : Option String) : Bool := if isWindows then p.parent == windowsParent else p.parent == unixParent #eval testParentAcrossOS "c:/a/b" "c:/a" "c:/a" #eval testParentAcrossOS "c:/a" "c:/" "c:" #eval testParentAcrossOS "c:/" none "c:" #eval testParentAcrossOS "c:" none none #eval FilePath.fileName "a/b" #eval FilePath.fileStem "a/b" #eval FilePath.fileStem "a/b.tar.gz" #eval FilePath.fileStem "a/.gitignore" #eval norm <| FilePath.withFileName "a/b" "c" #eval FilePath.extension "a/b" #eval FilePath.extension "a/b.txt" #eval FilePath.extension "a/.gitignore" #eval norm <| FilePath.withExtension "a/b.tar.gz" "xz" #eval norm <| FilePath.withExtension "a/b.tar.gz" "" #eval norm <| FilePath.withExtension "a/b" "tar.gz" #eval norm <| FilePath.addExtension "a/b.tar.gz" "bak"