-- © 2002-2005 Peter Thiemann
-- |Collection of function for manipulating file names.
module WASH.Utility.FileNames where

longestSuffix :: (a -> Bool) -> [a] -> [a]
longestSuffix p xs =
  let f [] suffix = suffix
      f (x : xs) suffix = f xs (if p x then xs else suffix)
  in  f xs xs


-- |longest suffix of path that does not contain '/'
filePart :: String -> String
filePart =
  longestSuffix (=='/')

-- |longest suffix of path that does not contain '.'
extName :: String -> String
extName =
  longestSuffix (=='.')

-- |longest prefix so that the rest contains '.'; entire string if no '.' present
baseName :: String -> String
baseName filename =
  let f "" = ""
      f ('.':rest) = g rest rest
      f (x:rest) = x:f rest
      g "" lst = ""
      g ('.':rest) lst = '.':f lst
      g (x:rest) lst = g rest lst
  in  f filename

-- |splits input at each '/'
fileToPath :: String -> [String]
fileToPath filename =
  let f acc path "" = reverse (reverse acc: path)
      f acc path ('/':xs) = f "" (reverse acc: path) xs
      f acc path (x:xs) = f (x:acc) path xs
  in  f "" [] filename

-- |drop the last component of a file path
dropLastComponent :: String -> String
dropLastComponent path =
  let f "" = ""
      f rpath = g rpath
      g ('/':rest) = g rest
      g "" = "/"
      g rpath = dropWhile (/='/') rpath
  in reverse (f (reverse path))