Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update documentation around non-capturing monadic bind for Action #849

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 8 additions & 2 deletions src/Development/Shake/Internal/Core/Types.hs
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,14 @@ import Prelude
-- To raise an exception call 'error', 'fail' or @'liftIO' . 'throwIO'@.
--
-- The 'Action' type is both a 'Monad' and 'Applicative'. Anything that is depended upon applicatively
-- will have its dependencies run in parallel. For example @'need' [\"a\"] *> 'need [\"b\"]@ is equivalent
-- to @'need' [\"a\", \"b\"]@.
-- will have its dependencies run in parallel. For example,
-- @'Development.Shake.Internal.Rules.File.need' [\"a\"] '*>' 'Development.Shake.Internal.Rules.File.need' [\"b\"]@
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I needed to fully qualify the path to need here, since it appears that Haddock can't figure it out:

https://hackage.haskell.org/package/shake-0.19.8/docs/Development-Shake.html#t:Action

image

See how the needs on the last line here aren't actually links, since Haddock doesn't seem to know where it should link to? Writing these as fully-qualified references should fix this.

-- is equivalent to @'need' [\"a\", \"b\"]@.
--
-- Note that since Shake 0.18, the non-capturing monadic bind ('>>') will also run its dependencies in parallel.
-- For example,
-- @'Development.Shake.Internal.Rules.File.need' [\"a\"] '>>' 'Development.Shake.Internal.Rules.File.need' [\"b\"]@
-- is also equivalent to @'Development.Shake.Internal.Rules.File.need' [\"a\", \"b\"]@.
newtype Action a = Action {fromAction :: RAW ([String],[Key]) [Value] Global Local a}
deriving (Functor, Applicative, Monad, MonadIO, Typeable, Semigroup, Monoid, MonadFail)

Expand Down
9 changes: 7 additions & 2 deletions src/Development/Shake/Internal/Rules/File.hs
Original file line number Diff line number Diff line change
Expand Up @@ -371,8 +371,13 @@ fileForward help act = addUserRule $ FileRule help $ fmap ModeForward . act
-- 'Development.Shake.cmd' \"rot13\" [src] \"-o\" [out]
-- @
--
-- Usually @need [foo,bar]@ is preferable to @need [foo] >> need [bar]@ as the former allows greater
-- parallelism, while the latter requires @foo@ to finish building before starting to build @bar@.
-- Note that the following expressions are all equivalent. @foo@ and @bar@ are built in parallel:
--
-- - @need [foo,bar]@
-- - @need [foo] '*>' need [bar]@
-- - @need [foo] '>>' need [bar]@
--
-- In this situation, @need [foo, bar]@ is preferable, since the parallelism is the most obvious.
Comment on lines -374 to +380
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had also wanted to add a note here saying something like:

If you do require that two separate needs are built sequentially, you can put another (non-need) Action in between, like the following:

do
  need [foo]
  liftIO (putStr "")
  need [bar]

However:

  • I wasn't sure what would be the best way to write this "no-op" Action (liftIO putStr seems kind of hacky)
  • This isn't something that just affects need, it also affects all the other actions that use need internally, like readFileLines.

--
-- This function should not be called with wildcards (e.g. @*.txt@ - use 'getDirectoryFiles' to expand them),
-- environment variables (e.g. @$HOME@ - use 'getEnv' to expand them) or directories (directories cannot be
Expand Down