{-# LANGUAGE TemplateHaskell, DataKinds #-} module System.XDG.FileSystem where import qualified Control.Exception as IO import qualified Data.ByteString.Lazy as BS import Path import Polysemy import Polysemy.Error import qualified System.IO.Error as IO import System.XDG.Error data ReadFile f m a where ReadFile ::Path Abs File -> ReadFile f m f makeSem ''ReadFile type FileList a = [(Path Abs File, a)] runReadFileList :: Member (Error XDGError) r => FileList a -> InterpreterFor (ReadFile a) r runReadFileList files = interpret (\(ReadFile path) -> maybe (throw $ FileNotFound path) pure $ lookup path files ) runReadFileIO :: Members '[Embed IO , Error XDGError] r => InterpreterFor (ReadFile BS.ByteString) r runReadFileIO = interpret (\(ReadFile path) -> do let notFound :: IO.IOException -> Maybe XDGError notFound e = if IO.isDoesNotExistError e then Just $ FileNotFound path else Nothing result <- embed $ IO.tryJust notFound $ BS.readFile $ toFilePath path either throw pure result )