tvl-depot/users/wpcarro/haskell-file/f.hs
Vincent Ambo 019f8fd211 subtree(users/wpcarro): docking briefcase at '24f5a642'
git-subtree-dir: users/wpcarro
git-subtree-mainline: 464bbcb15c
git-subtree-split: 24f5a642af
Change-Id: I6105b3762b79126b3488359c95978cadb3efa789
2021-12-14 02:15:47 +03:00

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 ()