shake-plus-extended: Experimental extensions to shake-plus

[ development, library, mit, shake ] [ Propose Tags ]

Experimental extensions to shake-plus - within-style file rules, HashMap and IxSet batch loaders.

[Skip to Readme]


Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


  • No Candidates
Versions [RSS],,,,,,,,
Change log
Dependencies aeson, base (>=4.7 && <5), binary-instances, comonad, extra, http-conduit, ixset-typed, ixset-typed-binary-instance, ixset-typed-hashable-instance, path, path-binary-instance, rio, shake, shake-plus (>=, within [details]
License MIT
Copyright 2020 Daniel Firth
Author Daniel Firth
Category development, shake
Source repo head: git clone
Uploaded by locallycompact at 2020-09-19T21:41:57Z
Distributions LTSHaskell:, NixOS:
Reverse Dependencies 1 direct, 0 indirect [details]
Downloads 1464 total (11 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-09-19 [all 1 reports]

Readme for shake-plus-extended-

[back to package description]

Shake+ Extended - Experimental Mechanisms For Shake

This library extends shake-plus, which enriches shake with ReaderT and the Path library. This extended ruleset introduces within, for better keeping track of source and output directories, as well as batch loading mechanisms using ixset-typed.

Using Within

One common complaint about Shake is having to keep track of source and output directories and translating FilePaths when using the input to an Action, leading to lots of repetition of the form (sourceFolder </>) . (-<.> ".ext") . dropDirectory1 which is prone to breakage. Using Path helps this to some degree, but in some cases is even more annoying because lots of Path functions use MonadThrow, leading to lots of monadic steps inside an RAction.

To alleviate this somewhat, we use Within b (Path Rel File) as a standard pattern for representing a file within a directory. Within is a type available in the within package that is simply a newtype wrapper over an Env comonad with the environment specialized to Path b Dir. We provide variants of the file operations and rules that typically accept or return Paths or contain callbacks that expect paths and change these to Within values. These functions are generally suffixed within. Here is the variant of getDirectoryFiles that produces Within values.

getDirectoryFilesWithin' :: MonadAction m => Within Rel [FilePattern] -> m [Within b (Path Rel File)]

You can convert to and from this within-style using within and fromWithin.

let x = $(mkRelFile "a.txt") `within` $(mkRelDir "foo") -- Within Rel (Path Rel File)
fromWithin x -- produces a `Path Rel File`

and you can assert that an existing path lies in a directory by using asWithin, which throws if the directory is not a proper prefix of the Path.

$(mkRelFile "foo/a.txt") `asWithin` $(mkRelDir "foo") -- fine
$(mkRelFile "a.txt") `asWithin` $(mkRelDir "foo") -- throws error

Filerules such as (%>) have within-style variants that accept an (Path b Dir) FilePattern on the left and carry that env to the callback.

(%^>) :: (Partial, MonadReader r m, MonadRules m) => Within Rel FilePattern -> (Within Rel (Path Rel File) -> RAction r ()) -> m ()

You change the underlying filepath with fmap or mapM, whilst you can move to a new parent directory by using localDir, or localDirM which is defined in the Within library for when the map between parent directories may throw. The Within library also contains more functions and instances for more precise changes between output and source directories.