blob: 7b2e93e0835841774d3c065422c2d2e52c4842aa (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
module TreeSearch where
import Data.Tree.Zipper
findTree :: (a -> Bool) -> TreePos Full a -> Maybe (TreePos Full a)
findTree p loc = if p (label loc)
then Just loc
else depthFirst loc >>= findTree p
depthFirst :: TreePos Full a -> Maybe (TreePos Full a)
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 -> 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
|