hierarchy-1.0.1: Predicated traversal of generated trees

Hierarchy

Synopsis

Documentation

type TreeT m = CofreeT Maybe m Source #

A TreeT is a tree of values, where the (possible) branches are ListTs over some Monad m.

select :: MonadPlus m => [a] -> m a Source #

Turn a list into a series of possibilities:

descend :: MonadPlus m => TreeT m a -> m (a, Maybe (TreeT m a)) Source #

Descend one level into a TreeT, yielding a list of values and their possible associated trees.

walk :: MonadPlus m => TreeT m a -> m a Source #

Perform a depth-first traversal of a TreeT, yielding a ListT of its contents. Note that breadth-first traversals cannot offer static memory guarantees, so they are not provided by this module.

winnow :: MonadPlus m => TreeT m a -> CondT a m () -> TreeT m a Source #

Given a TreeT, produce another TreeT which yields only those elements (and sub-trees) matching the given monadic conditional. This conditional (see CondT) can choose both elements and points of recursion, making it capable of expressing any tree traversal in the form of a predicate DSL. This differs from an expression-based traversal, like XPath or Lens, in that effects in m may be used to guide selection.

For example, to print all Haskell files under the current directory:

let files = winnow (directoryFiles ".") $do path <- query liftIO$ putStrLn $"Considering " ++ path when (path elem ["./.git", "./dist", "./result"]) prune -- ignore these, and don't recurse into them guard_ (".hs" isInfixOf) -- implicitly references path runEffect$ for (runListT (walk files)) \$ liftIO . print