64 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
| module F
 | |
|   ( join
 | |
|   , split
 | |
|   ) where
 | |
| 
 | |
| --------------------------------------------------------------------------------
 | |
| -- Dependencies
 | |
| --------------------------------------------------------------------------------
 | |
| 
 | |
| import Data.List (span)
 | |
| import System.FilePath (FilePath, pathSeparator)
 | |
| import System.FilePath.Posix (FilePath)
 | |
| import qualified System.FilePath.Posix as F
 | |
| 
 | |
| -- TODO: Move this to a misc.hs, prelude.hs, operators.hs; somewhere.
 | |
| (|>) :: a -> (a -> b) -> b
 | |
| (|>) a f = f a
 | |
| infixl 1 |>
 | |
| 
 | |
| -- TODO: Move this to a test_utils.hs or elsewhere.
 | |
| simpleAssert :: (Eq a) => a -> a -> ()
 | |
| simpleAssert x y =
 | |
|   if x == y then
 | |
|     ()
 | |
|   else
 | |
|     error "Assertion error"
 | |
| 
 | |
| --------------------------------------------------------------------------------
 | |
| -- Library
 | |
| --------------------------------------------------------------------------------
 | |
| 
 | |
| join :: [FilePath] -> FilePath
 | |
| join = F.joinPath
 | |
| 
 | |
| -- | Split path and return  list containing parts.
 | |
| split :: FilePath -> [String]
 | |
| split = splitJoin . span (/= pathSeparator)
 | |
|   where
 | |
|     splitJoin :: (String, String) -> [String]
 | |
|     splitJoin ([], []) = []
 | |
|     splitJoin (a, []) = [a]
 | |
|     splitJoin (a, [_]) = [a]
 | |
|     splitJoin (a, _:b) = a : split b
 | |
| 
 | |
| --------------------------------------------------------------------------------
 | |
| -- Tests
 | |
| --------------------------------------------------------------------------------
 | |
| 
 | |
| expected :: [([FilePath], FilePath)]
 | |
| expected = [ (["path"], "path")
 | |
|            , (["/path"], "/path")
 | |
|            , (["path", "to", "file"], "path/to/file")
 | |
|            , (["/path", "to", "file"], "/path/to/file")
 | |
|            , (["/"], "/")
 | |
|            ]
 | |
| 
 | |
| runTests :: [()]
 | |
| runTests =
 | |
|   fmap (\(input, expected) -> simpleAssert (join input) expected) expected
 | |
| 
 | |
| main :: IO ()
 | |
| main = do
 | |
|   print runTests
 | |
|   pure ()
 |