Safe Haskell | None |
---|---|
Language | Haskell2010 |
Documentation
type TreeT m = CofreeT Maybe m Source #
A TreeT
is a tree of values, where the (possible) branches are
ListT
s over some Monad m
.
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 referencespath
runEffect $ for (runListT (walk files)) $ liftIO . print