hierarchy-0.3.1: Pipes-based library for predicated traversal of generated trees

Safe HaskellNone




type TreeT m = CofreeT Maybe (ListT m) Source

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

selectEach :: Monad m => m [a] -> ListT m a Source

Turn a generated list into a ListT.

descend :: Monad m => TreeT m a -> ListT m (a, Maybe (TreeT m a)) Source

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

walk :: Monad m => TreeT m a -> ListT 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 :: Monad 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 (enumerate (walk files)) $ liftIO . print