packages feed

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)