module Data.Graph.Inductive.Internal.RootPath (
RTree,LRTree,
getPath,getLPath,
getDistance,
getLPathNodes
) where
import Data.Graph.Inductive.Graph
type LRTree a = [LPath a]
type RTree = [Path]
first :: ([a] -> Bool) -> [[a]] -> [a]
first p xss = case filter p xss of
[] -> []
x:_ -> x
findP :: Node -> LRTree a -> [LNode a]
findP _ [] = []
findP v (LP []:ps) = findP v ps
findP v (LP (p@((w,_):_)):ps) | v==w = p
| otherwise = findP v ps
getPath :: Node -> RTree -> Path
getPath v = reverse . first (\(w:_)->w==v)
getLPath :: Node -> LRTree a -> LPath a
getLPath v = LP . reverse . findP v
getDistance :: Node -> LRTree a -> Maybe a
getDistance v t = case findP v t of
[] -> Nothing
(_,d):_ -> Just d
getLPathNodes :: Node -> LRTree a -> Path
getLPathNodes v = (\(LP p)->map fst p) . getLPath v