alpha-0.9.6: src/My/Data/Tree.hs
module My.Data.Tree(module Data.Tree
,nubT,iterateT
,spanningTree) where
import Data.Tree
import Data.Set as S
import Control.Monad.State
nubT t = evalState (unfoldTreeM unfold t) S.empty
where unfold (Node a subs) = do
modify (S.insert a) ; s <- get
return (a,[sub | sub <- subs, not (S.member (rootLabel sub) s)])
iterateT seed f = unfoldTree (\a -> (a,f a)) seed
spanningTree seed nexts = nubT $ iterateT seed nexts