diff options
Diffstat (limited to 'TreeSearch.hs')
-rw-r--r-- | TreeSearch.hs | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/TreeSearch.hs b/TreeSearch.hs index 938b076..51d65c2 100644 --- a/TreeSearch.hs +++ b/TreeSearch.hs @@ -14,6 +14,36 @@ depthFirst loc = case firstChild loc of Just x -> Just x Nothing -> case next loc of Just x -> Just x + Nothing -> parentWithNext loc + where + parentWithNext x = + case parent x of + Nothing -> Nothing + Just x' -> case next x' of + Just x' -> Just x' + Nothing -> parentWithNext x' + + +findNext :: TreePos Full a -> Maybe (TreePos Full a) +findNext = depthFirst + + +findPrev :: TreePos Full a -> Maybe (TreePos Full a) +findPrev loc = + case prev loc of + Just x -> trans_lastChild x Nothing -> case parent loc of - Just x -> next x + Just x -> Just x Nothing -> Nothing + where + trans_lastChild x = + case lastChild x of + Nothing -> Just x + Just x' -> trans_lastChild x' + + +findParent :: (a -> Bool) -> TreePos Full a -> Maybe (TreePos Full a) +findParent p loc = + if p (label loc) + then Just loc + else parent loc >>= findParent p |