polysemy-fs: Low level filesystem operations for polysemy.

[ bsd3, library, polysemy-filesystem ] [ Propose Tags ]


[Index] [Quick Jump]


Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


  • No Candidates
Versions [RSS]
Change log ChangeLog.md
Dependencies base (>=4.7 && <5), bytestring, path, polysemy, rio, temporary, text, unliftio-path [details]
License BSD-3-Clause
Copyright dan.firth@homotopic.tech
Author Daniel Firth
Maintainer dan.firth@homotopic.tech
Revised Revision 1 made by locallycompact at 2021-08-06T19:48:10Z
Category Polysemy Filesystem
Source repo head: git clone https://gitlab.homotopic.tech/haskell/polysemy-fs
Uploaded by locallycompact at 2020-11-01T13:37:50Z
Distributions LTSHaskell:, NixOS:, Stackage:
Reverse Dependencies 3 direct, 0 indirect [details]
Downloads 418 total (15 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2020-11-01 [all 1 reports]

Readme for polysemy-fs-

[back to package description]


This package offers small filesystem effects for polysemy, such as:

data FSExist m a where
  DoesFileExist :: Path b File -> FSExist m Bool
  DoesDirExist  :: Path b Dir  -> FSExist m Bool

It should be noted that these are very weak semantic abstractions, as it does not provide a way to speak to the filesystem as a whole, and therefore is somewhat unsuitable for mocking. These effects exist primarily to give interpreters a way to be precise in the type of filesystem operations they use, and should be treated in the same way as Embed IO in that regard. However, if you need a quick fix - then using this directly in application code is a slight improvement over using Embed IO directly.

Using these as very low level compilation units allows you to inject debugging everywhere you use a filesystem operation. For example, using co-log-polysemy we can do this:

data FileExists where
  FileExists    :: Path b File -> FileExists
  FileNotExists :: Path b File -> FileExists

data DirExists where
  DirExists    :: Path b Dir -> DirExists
  DirNotExists :: Path b Dir -> DirExists

logFileExists :: Members '[FSExist, Log FileExists] r => Sem r a -> Sem r a
logFileExists = intercept \case
  DoesFileExist x -> do
    z <- doesFileExist x
    case z of
      True  -> log $ FileExists x
      False -> log $ FileNotExists x
    return z
  DoesDirExist x -> doesDirExist x

logDirExists :: Members '[FSExist, Log DirExists] r => Sem r a -> Sem r a
logDirExists = intercept \case
  DoesDirExist x  -> do
    z <- doesDirExist x
    case z of
      True  -> log $ DirExists x
      False -> log $ DirNotExists x
    return z
  DoesFileExist x -> doesFileExist x

For a look at a unified version of filesystem operations, check out polysemy-fskvstore