about summary refs log tree commit diff
path: root/users/wpcarro/haskell-file/f.hs
blob: 295575f3f48d1cc67be1c45df6b975476717877e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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 ()