uniform-fileio-0.1.5.2: Uniform/FilenameAlgebra.hs
-------------------------------------------------------------------
--
-- Module : FilenameAlgebra
-- Copyright : andrew u frank -
-- read:
-- https://hasufell.github.io/posts/2022-06-29-fixing-haskell-filepaths.html
----------------------------------------------------------------------
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
-- | the operations on filenames and extensions
-- no instances - all in Filenames or FilenamePath
module Uniform.FilenameAlgebra
( module Uniform.FilenameAlgebra,
)
where
import Uniform.Strings
-- newtype Extension = Extension FilePath deriving (Show, Read, Eq, Ord)
-- unExtension :: Extension -> FilePath
-- unExtension (Extension e) = e
-- makeExtension :: FilePath -> Extension
-- makeExtension = Extension
-- -- extension does not include a leading "."
-- -- would need a makeExtension in IO to catch errors here
-- makeExtensionT :: Text -> Extension
-- makeExtensionT = Extension . t2s
class Filenames fp fr where
getFileName :: fp -> fr
class Filenames1 fp where
-- instantiate only for filepath TODO do for path
getImmediateParentDir :: fp -> FilePath
-- ^ gets the name of the dir immediately above
getParentDir :: fp -> FilePath
-- ^ the parent dir of file
-- add a getParentdir with Path result
getNakedFileName :: fp -> FilePath
-- ^ filename without extension
getNakedDir :: fp -> FilePath
-- ^ get the last dir
-- class Filenames2 f1 f2 fr where
-- (</>) :: f1 -> f2 -> fr
-- addFileName :: f1 -> f2 -> fr
-- addFileName = (</>)
-- addDir :: f1 -> f2 -> fr
-- addDir = (</>)
class Filenames3 fp file where
type FileResultT fp file
-- add a filepath to a absolute dir and givev an absolte file
--
(</>), addFileName :: fp -> file -> FileResultT fp file
-- fails, if file is empty
-- does not add anything if file is empty
(</>) = addFileName
-- class Filenames3 fp file where
-- -- addFileName :: fp -> file -> file
-- -- addFileName = (</>)
-- type FileResultT fp file
-- -- removed the </> infix, too much confusions
-- -- -- add a filepath to a absolute dir and givev an absolte file
-- -- --
-- addFileName :: fp -> file -> FileResultT fp file
-- -- -- fails, if file is empty
-- -- -- does not add anything if file is empty
-- -- (</>) = addFileName
-- -- addFileName = (</>)
class Filenames4 fp file where
type FileResultT4 fp file
-- add a filepath to a absolute dir and givev an absolte dir
--
addDir :: fp -> file -> FileResultT4 fp file
-- addDir = (</>)
-- (</>) = addDir
class Filenames5 dir fil res where
stripPrefix :: dir -> fil -> Maybe res
-- ^ strip the
class (Eq (ExtensionType fp)) => Extensions fp where
-- extension do not include a leading '.'
type ExtensionType fp
getExtension :: fp -> ExtensionType fp
removeExtension :: fp -> fp
addExtension :: ExtensionType fp -> fp -> fp
-- setFileExtension :: ExtensionType fp -> fp -> fp
-- to avoid name clash with Path
-- must not have an extension before
(<.>) :: fp -> ExtensionType fp -> fp -- eror when not legal?
(<.>) f e = addExtension e f
setExtension :: ExtensionType fp -> fp -> fp
setExtension ext = addExtension ext . removeExtension
hasExtension :: ExtensionType fp -> fp -> Bool
hasExtension e = (e ==) . getExtension
prop_add_has :: ExtensionType fp -> fp -> Bool
prop_add_has e f = hasExtension e (addExtension e f)
prop_add_add_has :: ExtensionType fp -> ExtensionType fp -> fp -> Bool
prop_add_add_has e1 e2 f =
hasExtension
e1
(setExtension e1 . setExtension e2 $ f)
prop_set_get :: ExtensionType fp -> fp -> Bool
prop_set_get e f = ((e ==) . getExtension) (setExtension e f)